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;
The following STL example directs the compiler to generate all out-of-line methods for the “list” class, regardless of whether they are referenced by the user’s code:
[C++]template class list
You can also explicitly instantiate a single method, or a single static data member of a template class, which means that the method is generated to the .OBJ even though it is not used:
[C++]template void classname :: methodname; |
|
yasav |
Отправлено: 07.12.2006, 00:02 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 2
|
Прошу прощения за повтор. Не все правильно отобразилось. В 1 раз
Для функций:
в .h: CODE | template <typename T> T FooFunc(); |
в .cpp: CODE | template int FooFunc<int>(); //плюс реализация конечно |
CODE |
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<template parameter>;
The following STL example directs the compiler to generate all out-of-line methods for the “list<char>” class, regardless of whether they are referenced by the user’s code:
[C++]template class list<char>
You can also explicitly instantiate a single method, or a single static data member of a template class, which means that the method is generated to the .OBJ even though it is not used:
[C++]template void classname <template parameter>:: methodname; | |
|