Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/34: Рейтинг темы: голосов - 34, средняя оценка - 5.00
5 / 5 / 0
Регистрация: 22.10.2013
Сообщений: 103

Шаблонная функция в простом классе и ошибка "Ссылка на неразрешенный внешний символ"

22.08.2014, 15:02. Показов 7408. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
файл: A.h
C++
1
2
3
4
5
6
class A
{
public:
    template<class T>
    T func(T);
};
файл: A.cpp
C++
1
2
3
4
5
6
#include "A.h"
template<class T>
T A::func(T val)
{
    return val;
}
файл: main.cpp
C++
1
2
3
4
5
6
7
8
9
10
#include "A.h"
#include <iostream>
using namespace std;
 
int main(int argc, char** argv)
{
    A a;
    cout << a.func(11) << endl;
    return 0;
}
Выводит ошибку: 1 - Ошибка 1 error LNK2019: ссылка на неразрешенный внешний символ "public: int __thiscall A::func<int>(int)" (??$func@H@A@@QAEHH@Z) в функции _main D:\Projects\ABC\ABC\main.obj ABC
2 - Ошибка 2 error LNK1120: неразрешенных внешних элементов: 1 D:\Projects\ABC\Debug\ABC.exe 1 1 ABC

Подскажите пожалуйста в чем тут проблема?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.08.2014, 15:02
Ответы с готовыми решениями:

Ошибка в классе Vegetatable "LNK2019 ссылка на неразрешенный внешний символ _main"
Добрый день, дано условие : &quot;Создать класс Vegetable, содержащий следующие элементы: - поле «вес» float Mass; - поле «зрелость» ...

Дружественная функция шаблон и ошибка "Ссылка на неразрешенный внешний символ"
#include &lt;iostream&gt; using namespace std; template&lt;class T&gt; class random; template&lt;class T&gt; void f(random&lt;int&gt;); ...

Ошибка: ссылка на неразрешенный внешний символ
Уже час сижу не могу понять в чём дело. Получаю такие ошибки при компиляции: Файл интерфейса класса mystack.h: ...

8
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
22.08.2014, 15:05
реализация шаблонных функций должна быть в хедер-файле попадать в еденицу трансляции в которой используется
1
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2224 / 1426 / 420
Регистрация: 16.05.2013
Сообщений: 3,646
Записей в блоге: 6
22.08.2014, 15:05
Цитата Сообщение от OlegPL Посмотреть сообщение
Подскажите пожалуйста в чем тут проблема?
Проблема "времен очаковых и покорени Крыма". Кто учил вас разделять объявление и реализацию для шаблонов?
2
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
22.08.2014, 15:06
OlegPL, Нельзя разделять реализацию шаблооных функций/классов на .h и .cpp файлы (вообще можно, при определенных условиях, но сейчас это не важно).
2
5 / 5 / 0
Регистрация: 22.10.2013
Сообщений: 103
22.08.2014, 15:25  [ТС]
Думал что для шаблонных функций тоже нужно определять прототип и делать реализацию отдельно...

С шаблонными функциями разобрался.

Решил сделать шаблонный класс и напоролся на ошибки...
Добавлено через 14 минут

A.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#ifndef _A
#define _A
 
#include <iostream>
using namespace std;
 
class A
{
private:
    int privA;
protected:
    int protA;
public:
    int pubA;
    A();
    A(int, int, int);
    virtual void show();
    template<class T>
    T func(T val)
    {
        return val;
    }
};
 
#endif
A.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "A.h"
 
A::A() : privA(0), protA(0), pubA(0) 
{
    cout << "Конструктор A по умолчанию\n";
}
 
A::A(int priv, int prot, int pub) : privA(priv), protA(prot), pubA(pub) 
{
    cout << "Конструктор A с параметрами\n";
}
 
void A::show()
{
    cout << "PrivA: " << this->privA << " ProtA: " << this->protA << " PubA: " << this->pubA << endl;
}
B.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#ifndef _B
#define _B
 
#include "A.h"
 
template<class T>
class B : protected A
{
    T vr;
public:
    B();
    B(int, int, int, T);
    void show();
};
 
#endif
B.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "B.h"
 
template<class T>
B<T>::B() : A()
{
    cout << "Конструктор B по умолчанию\n";
}
 
template<class T>
B<T>::B(int aPriv, int aProt, int aPub, T v) : vr(v), A(aPriv, aProt, aPub)
{
    cout << "Конструктор B с параметрами\n";
}
 
template<class T>
void B<T>::show()
{
    cout << this->protA << " " << this->pubA << endl;
    cout << vr << endl;
}
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include "A.h"
#include "B.h"
 
int main(int argc, char** argv)
{
    setlocale(LC_ALL, "rus");
    A a;
    cout << a.func(11.25) << endl;
    B<int> b(1,2,3,4);
    b.show();
    return 0;
}
Ошибки:
1 - Ошибка 1 error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall B<int>::B<int>(int,int,int,int)" (??0?$B@H@@QAE@HHHH@Z) в функции _main D:\Projects\ABC\ABC\main.obj ABC
2 - Ошибка 2 error LNK2019: ссылка на неразрешенный внешний символ "public: virtual void __thiscall B<int>::show(void)" (?show@?$B@H@@UAEXXZ) в функции _main D:\Projects\ABC\ABC\main.obj ABC
3 - Ошибка 3 error LNK1120: неразрешенных внешних элементов: 2 D:\Projects\ABC\Debug\ABC.exe 1 1 ABC
0
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
22.08.2014, 15:29
Цитата Сообщение от OlegPL Посмотреть сообщение
Решил сделать шаблонный класс и напоролся на ошибки...


Цитата Сообщение от ForEveR Посмотреть сообщение
OlegPL, Нельзя разделять реализацию шаблооных функций/классов на .h и .cpp файлы (вообще можно, при определенных условиях, но сейчас это не важно).
1
5 / 5 / 0
Регистрация: 22.10.2013
Сообщений: 103
22.08.2014, 15:31  [ТС]
То есть весь класс B должен быть только в В.h ?
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
22.08.2014, 15:33
OlegPL, Именно так. Или можно по-разному извращаться... Явно инстанцировать все типы, которые будут использоваться в шаблоне... Включать в конце .h файла файл с реализацией... И т.д.
1
5 / 5 / 0
Регистрация: 22.10.2013
Сообщений: 103
22.08.2014, 15:34  [ТС]
Понял, большое спасибо! Сори за тупые вопросы...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.08.2014, 15:34
Помогаю со студенческими работами здесь

Ошибка: Ссылка на неразрешенный внешний символ
Доброго времени суток!Создал простенькую программу на си в визуал студии,а она ругается на ввод с клавиатуры skanf.error LNK2019: ссылка на...

Ошибка: Ссылка на неразрешенный внешний символ
void Culinary::SaveProvider(){ try{ if( !editProviderName-&gt;text().isEmpty() || !editProviderAdres-&gt;text().isEmpty() ...

Ошибка (ссылка на неразрешенный внешний символ )
Подскажите, из-за чего может возникать такая ошибка?

Ошибка. Ссылка на неразрешенный внешний символ
Здравствуйте. Ошибка такая: LNK2019 ссылка на неразрешенный внешний символ _main в функции &quot;int __cdecl invoke_main(void)&quot;...

Ошибка (ссылка на неразрешенный внешний символ )
Подскажите, из-за чего может возникать такая ошибка? #include &lt;iostream&gt; #include &quot;Header.h&quot; using namespace std; void...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru