#include"tclass.h"void main () {
CTypedTexture<Texture2D,Texture2D> d;
}
Получаем на выходе ошибку:
LINK : warning LNK4224: /PDBTYPE is no longer supported; ignored
main.obj : error LNK2019: unresolved external symbol "public: __thiscall CTypedTexture<class Type2Int<11>,class Type2Int<11> >::~CTypedTexture<class Type2Int<11>,class Type2Int<11> >(void)" (??1?$CTypedTexture@V?$Type2Int@$0L@@@V1@@@QAE@XZ) referenc
ed in function _main
main.obj : error LNK2019: unresolved external symbol "public: __thiscall CTypedTexture<class Type2Int<11>,class Type2Int<11> >::CTypedTexture<class Type2Int<11>,class Type2Int<11> >(void)" (??0?$CTypedTexture@V?$Type2Int@$0L@@@V1@@@QAE@XZ) reference
d in function _main
Debug/ttest.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.
Как правильно определить члены класса-шаблона в .cpp?
Если просто скопировать определения из tclass.cpp в tclass.h, то все компилиться будет, но тогда проект приходиться каждый раз полностью перекомпилировать, при измении кода определения в .h.
Плиз, помогите чайнику!
Re: Внешнее (в .cpp) определение функции класса-шаблона
А>#include"tclass.h"
А>void main () {
А> CTypedTexture<Texture2D,Texture2D> d;
А>}
А>
А>Получаем на выходе ошибку: А>
А>LINK : warning LNK4224: /PDBTYPE is no longer supported; ignored
А>main.obj : error LNK2019: unresolved external symbol "public: __thiscall CTypedTexture<class Type2Int<11>,class Type2Int<11> >::~CTypedTexture<class Type2Int<11>,class Type2Int<11> >(void)" (??1?$CTypedTexture@V?$Type2Int@$0L@@@V1@@@QAE@XZ) referenc
А>ed in function _main
А>main.obj : error LNK2019: unresolved external symbol "public: __thiscall CTypedTexture<class Type2Int<11>,class Type2Int<11> >::CTypedTexture<class Type2Int<11>,class Type2Int<11> >(void)" (??0?$CTypedTexture@V?$Type2Int@$0L@@@V1@@@QAE@XZ) reference
А>d in function _main
А>Debug/ttest.exe : fatal error LNK1120: 2 unresolved externals
А>Error executing link.exe.
А>
А>Как правильно определить члены класса-шаблона в .cpp?
А>Если просто скопировать определения из tclass.cpp в tclass.h, то все компилиться будет, но тогда проект приходиться каждый раз полностью перекомпилировать, при измении кода определения в .h.
А>Плиз, помогите чайнику!
Определение шаблонов должно быть в одной единицы трансляции.
А по существу: перенесите имплементацию шаблона в заголовочный файл.
Здравствуйте, Аноним, Вы писали:
А>Как правильно определить члены класса-шаблона в .cpp?
Есть такое волшебное слово "экспорт шаблонов" (поиском по сайту: export template).
В VC71 не поддерживается.
А>Если просто скопировать определения из tclass.cpp в tclass.h, то все компилиться будет,
И это является самым правильным и переносимым решением
А>но тогда проект приходиться каждый раз полностью перекомпилировать, при измении кода определения в .h.
При изменении файла с определением экспортных шаблонов — тоже придётся всё перекомпилировать.
Так что, если бы даже это было возможно, то тебя не спасло бы.
Отсюда мораль: постарайся отладить свои шаблоны, чтобы потом к ним как можно реже возвращаться.
Перекуём баги на фичи!
Re[2]: Внешнее (в .cpp) определение функции класса-шаблона
А вот определения функций и статических членов полных специализаций — можно (а то и нужно) выносить в .cpp, потому что компилятор их воплотит, а линкер найдёт (и хорошо бы, чтоб он их нашёл в количестве 1 шт. на проект).
Или объявлять их __declspec(any) (MS-specific: инструкция линкеру, чтобы выбрал любой из найденных, а не ругался на многократное определение); тот же эффект приносит слово inline.
Перекуём баги на фичи!
Re: Внешнее (в .cpp) определение функции класса-шаблона
А>#include"tclass.h"
А>template<class T>
А>CTypedTexture<T,Texture2D>::CTypedTexture() {};
А>template<class T>
А>CTypedTexture<T,Texture2D>::~CTypedTexture() {};
template class CTypedTexture<int, Texture2D>;
template class СTypedTexture<float, Texture2D>;
template class СTypedTexture<dummy, Texture2D>;
//явное инстаницирование шаблонов, теперь чтобы использовать этой шаблон с типами int, float, dummy в других единицах трансляции достаточно включить tclass.h
А>
Re[2]: Внешнее (в .cpp) определение функции класса-шаблона
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>как раз так сделать нельзя L_L>14.7/5
Для ленивых и у кого стандарта нет:
No program shall explicitly instantiate any template more than once, both explicitly instantiate and explicitly
specialize a template, or specialize a template more than once for a given set of template-arguments.
An implementation is not required to diagnose a violation of this rule.
А что собственно нельзя? Код шаблона находится в Cpp файле, явно инстанцировать из других единиц трансляции все равно не получится... Или дело в параметре Texture2D?
И зачем такое ограничение в стандарте? Сложно что-ли?
Re[4]: Внешнее (в .cpp) определение функции класса-шаблона
PC>А что собственно нельзя? Код шаблона находится в Cpp файле, явно инстанцировать из других единиц трансляции все равно не получится... Или дело в параметре Texture2D?
Дело в h файле который включается в несколько cpp файлов, что приведет к нарушению требования однократного явного инстанцирования. А делается это так — h файл содержит объявление шалона, cpp содержит определение и явное инстанцирование, пользовательский код включает заголовок. Естественно, что параметризация будет ограничено теми типами, которыми явно инстанцировали в том cpp
Of course, the code must be complete enough to compile and link.
Re[5]: Внешнее (в .cpp) определение функции класса-шаблона
Здравствуйте, Lorenzo_LAMAS, Вы писали:
PC>>А что собственно нельзя? Код шаблона находится в Cpp файле, явно инстанцировать из других единиц трансляции все равно не получится... Или дело в параметре Texture2D?
L_L>Дело в h файле который включается в несколько cpp файлов, что приведет к нарушению требования однократного явного инстанцирования.
У меня явное инстаницирование в CPP!!!
L_L>А делается это так — h файл содержит объявление шалона, cpp содержит определение и явное инстанцирование, пользовательский код включает заголовок. Естественно, что параметризация будет ограничено теми типами, которыми явно инстанцировали в том cpp