Такая проблемка. Есть программа из двух модулей. Один модуль содержит шаблонный класс, а другой — его использует. Все работает, если тело метода определено внутри класса. Если же метод определен вне класса (т. е. в cpp-файле, а не в h-файле), то я получаю ошибку компоновщика:
error LNK2019: unresolved external symbol "public: void __thiscall C<class C117>::Print(void)" (?Print@?$C@VC117@@@@QAEXXZ) referenced in function _main
Здравствуйте, AdUser, Вы писали:
AU>Такая проблемка. Есть программа из двух модулей. Один модуль содержит шаблонный класс, а другой — его использует. Все работает, если тело метода определено внутри класса. Если же метод определен вне класса (т. е. в cpp-файле, а не в h-файле), то я получаю ошибку компоновщика:
AU>error LNK2019: unresolved external symbol "public: void __thiscall C<class C117>::Print(void)" (?Print@?$C@VC117@@@@QAEXXZ) referenced in function _main
AU>Метод я определяю так:
AU>template <class T> void C<T>::Print(){ AU> cout<<Field.ToInt()<<endl; AU>};
AU>Как избежать этой ошибки?
Можно оставь тело в h-файле, тока вынесити его из класса
типа
template<class T>
class SomeClass
{
int GetInt() const;
};
template<class T>
int SomeClass<T>::GetInt() const
{
return 12;
}
Или можно вынести тело в какой-нить hpp-файл а потом там где нужно подключать его.
Спасибо за ответ. Но есть еще пара непонятных мне вещей.
1. Не вполне понятна природа сей ошибки. Хорошо, определение шаблонного класса не приводит к генерации машинного кода, но тогда, по логике, первое использование этого класса с определенными параметрами должно приводить к генерации машинного кода. Почему же компилятор поленился сделать это в моем случае?
2. Если я, последовав Вашему совету, текст методов буду размещать в том же h-файле, что и сам класс, и при этом буду использовать шаблонный класс с одним и тем же параметром в двух модулях, то получается, что в EXE-файле один и тот же класс будет содержаться дважды? И, кстати, нет ли тут опасности, что может возникнуть ошибка компоновщика по поводу того, что один и тот же символ реализован неоднократно (хотя экспериментально мне добиться ее не удалось)?
Здравствуйте, AdUser, Вы писали:
AU>1. Не вполне понятна природа сей ошибки.
А что тут понимать? компилятор компилирует каждый cpp фаил в отдельности и что лежит в другом он не знает.
AU>2. Если я, последовав Вашему совету,
Все так делают. Все будет ОК.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн