Имеется следующий код:test.h:
template <typename T>
class A
{
public:
T func();
};test.cpp:
#include "test.h"template <typename T>
T A<T>::func()
{
return 0;
}t.cpp:
#include "test.h"int main()
{
A<int> a;
a.func();
return -1;
}SConstruct:
Program('test', ['t.cpp','test.cpp'], CCFLAGS="")собираю с помощью scons. вывод:
slon@slon test $ scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o t.o -c t.cpp
g++ -o test.o -c test.cpp
g++ -o test t.o test.o
t.o: In function `main':
t.cpp:(.text+0x18): undefined reference to `A<int>::func()'
collect2: ld returned 1 exit status
scons: *** [test] Error 1
scons: building terminated because of errors.Почему линкер не находит функцию func? Видимо необходимы какие-то особые параметры линковки/компиляции? Если перенести определение функции в класс - всё замечательно. Гугл и маны мне не помогли, вся надежда на совет. Заранее спасибо :)
Компилятор: gcc (GCC) 4.1.2 (Gentoo 4.1.2)
Линкер: GNU ld (GNU Binutils) 2.18
Вопрос на засыпку: что получается в объектном файле test.o?
Самый простой способ избежать проблемы - писать шаблон вместе с реализацией в одном заголовочном файле, т. е. файла test.cpp вообще не должно быть. Подробности - в гугле и книжках. :)
>Самый простой способ избежать проблемы - писать шаблон вместе с реализацией в
>одном заголовочном файле, т. е. файла test.cpp вообще не должно быть.Да, все в .h файле. Почему хз, где-то написано.
Добрый день. То, о чем Вы говорите, называется external template. К сожалению, эта часть стандарта не реализована С++ большинством компиляторов, по этому так писать не принято. Полное описание проблемы и её решения на английском языке Вы можете прочесть тут - http://www.codeguru.com/forum/showthread.php?t=250284
>Добрый день. То, о чем Вы говорите, называется external template. К сожалению,
>эта часть стандарта не реализована С++ большинством компиляторов, по этому так
>писать не принято. Полное описание проблемы и её решения на английском
>языке Вы можете прочесть тут - http://www.codeguru.com/forum/showthread.php?t=250284Большое спасибо =) Собственно, что и требовалось узнать.