Шаблонные классы. Ошибка компоновщика
От: AdUser  
Дата: 21.07.04 10:21
Оценка:
Такая проблемка. Есть программа из двух модулей. Один модуль содержит шаблонный класс, а другой — его использует. Все работает, если тело метода определено внутри класса. Если же метод определен вне класса (т. е. в cpp-файле, а не в h-файле), то я получаю ошибку компоновщика:

error LNK2019: unresolved external symbol "public: void __thiscall C<class C117>::Print(void)" (?Print@?$C@VC117@@@@QAEXXZ) referenced in function _main

Метод я определяю так:

template <class T> void C<T>::Print(){
cout<<Field.ToInt()<<endl;
};

Как избежать этой ошибки?
Re: Шаблонные классы. Ошибка компоновщика
От: Glоbus Украина  
Дата: 21.07.04 10:25
Оценка: 2 (1)
Здравствуйте, 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-файл а потом там где нужно подключать его.
Удачи тебе, браток!
Re: Шаблонные классы. Ошибка компоновщика
От: Bell Россия  
Дата: 21.07.04 11:22
Оценка:
Здравствуйте, AdUser, Вы писали:

AU>Как избежать этой ошибки?

Определение должно быть в заголовке. За подробностями — в поиск.
Любите книгу — источник знаний (с) М.Горький
Re[2]: Шаблонные классы. Ошибка компоновщика
От: AdUser  
Дата: 21.07.04 17:31
Оценка:
Спасибо за ответ. Но есть еще пара непонятных мне вещей.

1. Не вполне понятна природа сей ошибки. Хорошо, определение шаблонного класса не приводит к генерации машинного кода, но тогда, по логике, первое использование этого класса с определенными параметрами должно приводить к генерации машинного кода. Почему же компилятор поленился сделать это в моем случае?

2. Если я, последовав Вашему совету, текст методов буду размещать в том же h-файле, что и сам класс, и при этом буду использовать шаблонный класс с одним и тем же параметром в двух модулях, то получается, что в EXE-файле один и тот же класс будет содержаться дважды? И, кстати, нет ли тут опасности, что может возникнуть ошибка компоновщика по поводу того, что один и тот же символ реализован неоднократно (хотя экспериментально мне добиться ее не удалось)?
Re[3]: Шаблонные классы. Ошибка компоновщика
От: WolfHound  
Дата: 21.07.04 18:50
Оценка:
Здравствуйте, AdUser, Вы писали:

AU>1. Не вполне понятна природа сей ошибки.

А что тут понимать? компилятор компилирует каждый cpp фаил в отдельности и что лежит в другом он не знает.

AU>2. Если я, последовав Вашему совету,

Все так делают. Все будет ОК.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.