0 / 0 / 0
Регистрация: 19.09.2014
Сообщений: 8
|
||||||||||||||||
1 | ||||||||||||||||
Ошибка lnk2019 для шаблонов в многофайловом приложении19.09.2014, 23:30. Показов 4395. Ответов 6
Метки нет (Все метки)
Написал минимальный код, генерирующий такую ошибку. Сборщик ругается, что конструктор Obj1 не определен. Разве все cpp файлы, включенные в проект, не компилируются автоматически? Если сделать класс не шаблонным, ошибки не будет. Как избавиться от этой ошибки не объединяя эти файлы?
файл Obj1.h:
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Obj1<int>::Obj1<int>(void)" (??0?$Obj1@H@@QAE@XZ) в функции _main
0
|
19.09.2014, 23:30 | |
Ответы с готовыми решениями:
6
Ошибка LNK2019 в многофайловом проекте Ошибка 2019 с линковщиком в многофайловом приложении Баг VS или как? Функция в многофайловом приложении Использование string в многофайловом приложении. Необходимость подключения библиотек и пространства имён |
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
|
|
19.09.2014, 23:33 | 2 |
Mr Snail, шаблоны вроде как нужно полностью определять в заголовке, т.е. .h я имею виду
0
|
0 / 0 / 0
Регистрация: 19.09.2014
Сообщений: 8
|
||||||
19.09.2014, 23:43 [ТС] | 3 | |||||
Если удалить main.cpp, а файл Obj1.cpp написать как:
0
|
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
|
|
19.09.2014, 23:49 | 4 |
Mr Snail, потому что отдельный маин.срр должен видеть то место, где определяется шаблон, во втором случае он его видит как нельзя лучше, в первом есть 2 единицы трансляции (или как-то так, могу путать) маин + .h и .h + .cpp шаблона. соответственно маин и не видит
можно добавить .cpp в инклуды, должно тоже прокатить
0
|
0 / 0 / 0
Регистрация: 19.09.2014
Сообщений: 8
|
|
19.09.2014, 23:54 [ТС] | 5 |
Но почему в случае нешаблонного класса main.cpp "видит" Obj.cpp ?
0
|
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
|
|
20.09.2014, 00:02 | 6 |
Mr Snail, сумбурно наверно пояснил. Может так будет лучше:
Когда вы создаете какой-то класс (не шаблонный), компилятор из .cpp склепает СРАЗУ объектный файл, а мейн лишь будет вызывать оттуда функции, которые прописаны в .h И не важно, как они там реализованы, мейн это не волнует. Но когда вы пытаетесь написать шаблонный класс, компилятор НИЧЕГО не создаст просто так, он будет создавать по мере необходимости. И вот увидев, что надо создать по шаблону объект для int, компилятор ищет соответствующий шаблон, по которому он должен создать объект. НО он найдет лишь заголовок из .h Про Obj1.cpp он вообще понятия не имеет, т.к. его нет в инклудах майна. Добавлено через 2 минуты PS: только начинаю учиться, могут быть неточности в терминологии. Но постарался отразить суть.
1
|
18898 / 9856 / 2410
Регистрация: 30.01.2014
Сообщений: 17,299
|
|
20.09.2014, 00:13 | 7 |
Компиляция в С++ раздельная (каждый файл (обычно cpp) компилируется независимо).
Линкер связывает (как ты сказал "видит") имена сущностей между разными модулями. Шаблон - это, считай, образец для кода. Кодом он становится только при подстановке аргументов - инстанцировании. Чтобы была возможность сгенерировать по образцу (шаблону) код, нужно чтобы весь он был доступен в месте генерации (еще раз вспоминаем, что компиляция в С++ раздельная). Когда ты разнес его по разным модулям, то ты лишил main полной информации о шаблоне. Отсюда и ошибка. Вот связанная с твоей тема.
1
|
20.09.2014, 00:13 | |
20.09.2014, 00:13 | |
Помогаю со студенческими работами здесь
7
Программа из учебника Прата. Структуры в многофайловом приложении. Исправить недочеты в коде Ошибка в приложении: "error LNK2019: ссылка на неразрешенный внешний символ" Ошибка LNK2005 в многофайловом проекте Ошибка линковки в многофайловом проекте Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |