Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Mr Snail
0 / 0 / 0
Регистрация: 19.09.2014
Сообщений: 8
#1

Ошибка lnk2019 для шаблонов в многофайловом приложении - C++

19.09.2014, 23:30. Просмотров 703. Ответов 6
Метки нет (Все метки)

Написал минимальный код, генерирующий такую ошибку. Сборщик ругается, что конструктор Obj1 не определен. Разве все cpp файлы, включенные в проект, не компилируются автоматически? Если сделать класс не шаблонным, ошибки не будет. Как избавиться от этой ошибки не объединяя эти файлы?
файл Obj1.h:
C++
1
2
3
4
5
template<typename T>
class Obj1{
public:
    Obj1();
};
файл Obj1.cpp:
C++
1
2
3
4
#include "Obj1.h"
 
template <typename T>
Obj1<T>::Obj1(){}
файл main.cpp:
C++
1
2
3
4
5
#include "Obj1.h"
 
void main(){
    Obj1<int> A;
}
Ошибка:
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Obj1<int>::Obj1<int>(void)" (??0?$Obj1@H@@QAE@XZ) в функции _main
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.09.2014, 23:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка lnk2019 для шаблонов в многофайловом приложении (C++):

Ошибка LNK2019 в многофайловом проекте - C++
Смысл: Мне нужно создать абстрактный класс контейнер, на его основе конкретные классы, далее создать абстрактный класс итератор и для...

Ошибка 2019 с линковщиком в многофайловом приложении - C++
не могу понять в чем тут проблема. выдает ошибки: 1&gt;main.obj : error LNK2019: ссылка на неразрешенный внешний символ &quot;void __cdecl...

Баг VS или как? Функция в многофайловом приложении - C++
#include &quot;function.h&quot; int main(){ LoadFileToStack(); cout &lt;&lt; endl; st return 0; } void LoadFileToStack() ...

Использование string в многофайловом приложении. Необходимость подключения библиотек и пространства имён - C++
Здравствуйте. Есть заголовочный и cpp файлы. В заголовочном пишу#ifndef MODEL_H #define MODEL_H struct Vertex { float x, y, z; ...

Программа из учебника Прата. Структуры в многофайловом приложении. Исправить недочеты в коде - C++
Посмотрите, пожалуйста, что где исправить. int fill()-для заполнения массива all-для вывода суммы продаж за 4 квартала первый: ...

Ошибка в приложении: "error LNK2019: ссылка на неразрешенный внешний символ" - C++
Создал консольное приложение и в него добавил код: #include &quot;afxwin.h&quot; // MFC Основные и стандартные компоненты class CMainWnd :...

6
КОП
361 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 762
19.09.2014, 23:33 #2
Mr Snail, шаблоны вроде как нужно полностью определять в заголовке, т.е. .h я имею виду
0
Mr Snail
0 / 0 / 0
Регистрация: 19.09.2014
Сообщений: 8
19.09.2014, 23:43  [ТС] #3
Если удалить main.cpp, а файл Obj1.cpp написать как:
C++
1
2
3
4
5
6
7
8
#include "Obj1.h"
 
template <typename T>
Obj1<T>::Obj1(){}
 
void main(){
    Obj1<int> A;
}
то ошибка пропадает, хотя определение не в заголовке, так что проблема не в этом.
0
КОП
361 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 762
19.09.2014, 23:49 #4
Mr Snail, потому что отдельный маин.срр должен видеть то место, где определяется шаблон, во втором случае он его видит как нельзя лучше, в первом есть 2 единицы трансляции (или как-то так, могу путать) маин + .h и .h + .cpp шаблона. соответственно маин и не видит
можно добавить .cpp в инклуды, должно тоже прокатить
0
Mr Snail
0 / 0 / 0
Регистрация: 19.09.2014
Сообщений: 8
19.09.2014, 23:54  [ТС] #5
Но почему в случае нешаблонного класса main.cpp "видит" Obj.cpp ?
0
КОП
361 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 762
20.09.2014, 00:02 #6
Mr Snail, сумбурно наверно пояснил. Может так будет лучше:
Когда вы создаете какой-то класс (не шаблонный), компилятор из .cpp склепает СРАЗУ объектный файл, а мейн лишь будет вызывать оттуда функции, которые прописаны в .h И не важно, как они там реализованы, мейн это не волнует.
Но когда вы пытаетесь написать шаблонный класс, компилятор НИЧЕГО не создаст просто так, он будет создавать по мере необходимости. И вот увидев, что надо создать по шаблону объект для int, компилятор ищет соответствующий шаблон, по которому он должен создать объект. НО он найдет лишь заголовок из .h Про Obj1.cpp он вообще понятия не имеет, т.к. его нет в инклудах майна.

Добавлено через 2 минуты
PS: только начинаю учиться, могут быть неточности в терминологии. Но постарался отразить суть.
1
DrOffset
7310 / 4406 / 998
Регистрация: 30.01.2014
Сообщений: 7,242
20.09.2014, 00:13 #7
Цитата Сообщение от Mr Snail Посмотреть сообщение
Но почему в случае нешаблонного класса main.cpp "видит" Obj.cpp ?
Компиляция в С++ раздельная (каждый файл (обычно cpp) компилируется независимо).
Линкер связывает (как ты сказал "видит") имена сущностей между разными модулями.
Шаблон - это, считай, образец для кода. Кодом он становится только при подстановке аргументов - инстанцировании. Чтобы была возможность сгенерировать по образцу (шаблону) код, нужно чтобы весь он был доступен в месте генерации (еще раз вспоминаем, что компиляция в С++ раздельная). Когда ты разнес его по разным модулям, то ты лишил main полной информации о шаблоне. Отсюда и ошибка.
Вот связанная с твоей тема.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.09.2014, 00:13
Привет! Вот еще темы с ответами:

Ошибка линковки в многофайловом проекте - C++
что за на??? в проекте 3 модуля: main.cpp, test.cpp, test.h, в main.cpp и test.cpp подключен test.h, в test.h одна единственная функция int...

Ошибка при работе с шаблонами в многофайловом проекте - C++
Цель проста - пишу класс очереди, используя шаблоны. Возниает следующая ошибка: ||=== Build: Debug in Queue (compiler: GNU GCC Compiler)...

Ошибка 2 error LNK2019, не пойму в чем ошибка - C++
Выдает такую ошибку: Ошибка 2 error LNK2019: ссылка на неразрешенный внешний символ &quot;int __cdecl game(void)&quot; (?game@@YAHXZ) в функции....

Ошибка LNK2019 - C++
Добрый день. Недавно начала изучать С++ (необходимо для научной деятельности). Программирую я в Visual Studio 2010 Express Напечатал я...


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

Или воспользуйтесь поиском по форуму:
7
Yandex
Объявления
20.09.2014, 00:13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru