C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
про шаблон класса, не линкуется (
vvv40
Отправлено: 06.12.2006, 14:15


Ученик-кочегар

Группа: Участник
Сообщений: 8



есть два unit'а. В одном определяю шаблон класса, в другом пытаюсь его использовать. Компилится, но не линкуется. Если вместо шаблона класса просто определяю обычный класс — все OK. Если использую шаблон и все размещаю в одном cpp-файле — тоже все OK. Может что подскажите ?

CODE

//------------ Unit2.h ----------------------
class myClass1 {
public:
  int i;
  myClass1(); };

template <class T2> class myClass2 {
public:
  int i;
  myClass2();  };

//------------ Unit2.cpp --------------------
#include "Unit2.h"

myClass1::myClass1() { i = 0; }

template <class T2> myClass2<T2>::myClass2() { i = 0; }

//------------ Unit1.cpp --------------------
#include "Unit1.h"
  myClass1 ob01;       // так все нормально
  myClass2<int> ob02;  // это вызывает ошибку:


[Linker Error] Unresolved external 'myClass1::myClass1()'
referenced from UNIT1.OBJ
olegenty
Отправлено: 06.12.2006, 14:37


Ветеран

Группа: Модератор
Сообщений: 2412



ошибка про первый класс, а не про второй.

однако, ВСЕ МЕТОДЫ ШАБЛОННОГО КЛАССА ДОЛЖНЫ БЫТЬ ОПРЕДЕЛЕНЫ В ЗАГОЛОВОЧНОМ ФАЙЛЕ.

ибо что есть шаблон? шаблон суть макрос.
vvv40
Отправлено: 06.12.2006, 14:50


Ученик-кочегар

Группа: Участник
Сообщений: 8



спасибо !
бум знать...
все заработало
yasav
Отправлено: 06.12.2006, 23:56


Ученик-кочегар

Группа: Участник
Сообщений: 2



Утверждение
"ВСЕ МЕТОДЫ ШАБЛОННОГО КЛАССА ДОЛЖНЫ БЫТЬ ОПРЕДЕЛЕНЫ В ЗАГОЛОВОЧНОМ ФАЙЛЕ" не верно

Можно в Unit2.cpp добавить объявление для всех используемых типов шаблонов, например:

CODE
template myClass2<int>; //заставляет компилировать реализацию для шаблона с параметром int.


Тогда в других модулях можно испльзовать только шаблоны перечисленных типов.


Для функций:
в .h: template T FooFunc();
в .cpp: template int FooFunc(); //плюс реализация конечно

The C++ compiler generates the following methods for template instances:

Those methods which were actually used
Virtual methods of an instance
All methods of explicitly instantiated classes
The advantage of this behavior is that it results in significantly smaller object files, libraries and executable files, depending on how heavily you use templates.

Optionally, you can use the ‘-Ja’ switch to generate all methods.

You can also force all of the out-of-line methods of a template instance to be generated by using the explicit template instantiation syntax defined in the ISO/ANSI C++ Standard. The syntax is:

template class classname