C ++模板,未定义的参考

我有一个函数声明如下:

template <typename T> T read(); 

并定义如下:

 template <typename T> T packetreader::read() { offset += sizeof(T); return *(T*)(buf+offset-sizeof(T)); } 

但是,当我尝试在我的main()函数中使用它时:

 packetreader reader; reader.read<int>(); 

我从g ++得到以下错误:

 g++ -o main main.o packet.o main.o: In function `main': main.cpp:(.text+0xcc): undefined reference to `int packetreader::read<int>()' collect2: ld returned 1 exit status make: *** [main] Error 1 

任何人都可以指出我正确的方向?

您需要使用export关键字。 但是,我不认为G ++有适当的支持,所以你需要在头文件中包含模板函数的定义,以便翻译单元可以使用它。 这是因为模板的<int> '版本'尚未创build,只有<typename T> '版本'。

一个简单的方法是#include .cpp文件。 但是,这可能会导致问题,例如其他函数在.cpp文件中时。 这也可能会增加编译时间。

一个干净的方法是将你的模板函数移动到它自己的.cpp文件中,并将其包含在标题中使用export关键字并单独编译。

更多关于为什么你应该试着把模板函数定义放在它的头文件中(并且完全忽略export )的信息。

问题是函数模板不是函数。 这是根据需要创buildfunction的模板。

所以为了使模板起作用,编译器直观地需要两条信息:模板本身以及应该被replace的types。 这与函数调用不同,只要知道该函数存在,编译器就可以生成该函数。 它不需要知道函数做了什么,只是看起来像void Frobnicate(int, float) ,或者它的签名是什么。

当你声明函数模板而不定义它时,你只是告诉编译器这样的模板存在,但不是它看起来像。 编译器不能够实例化它,它也必须能够看到完整的定义。 通常的解决scheme是将整个模板放在可以包含在需要的标题中。

模板函数的最佳做法是在头文件中定义它们。 它们是在编译时创build的,因此编译器必须有定义才能这样做。

当为模板export会得到更多的支持,但情况并非如此,但目前仍难以使用。

他们的任何编译器支持模板单独编译?

据我所知,常见的做法是在头文件中声明和实现模板函数