我的LinkedList实现中有两个分支。 Master是一个简单的,只适用于整数数据类型。虽然_templates one设计有模板,可以为任何数据类型提供服务。
我的主分支完美地编译:
g++ -0 t1 main.cpp LinkedList.cpp Node.cpp
另一方面,当我尝试使用相同的方法编译我的_templates分支时(我在此分支中使用模板更改了实现):
g++ -0 t1 main.cpp LinkedList.cpp Node.cpp
我收到了链接错误:
undefined reference to `LinkedList<int>::LinkedList()'
undefined reference to `LinkedList<int>::~LinkedList()'
只是要绝对清楚,我的构造函数在_templates分支
template <class T>
LinkedList<T>::LinkedList() {
head = 0;
tail = 0;
}
答案 0 :(得分:1)
使用模板时,您的整个实现必须始终可见所有实现它的文件。即如果你在标题中有你的类声明,那么定义也必须在那个标题的“内部”(见下文)。
这是因为编译器无法知道哪些类型可能会使用它,因此无法为该类型保留内存(想想它是否曾尝试为每种类型创建一个LinkedList;世界上没有足够的内存来去做!)。因此,只有在您决定在代码体中实例化时才会定义特定类型的类。如果你从不使用该类,那么它只是纯文本,程序的大小也不会更大。
在头文件中隐藏您的实现有一些技巧,例如将它们放在名为“LinkedList.tem”或“LinkedList.tcc”等的文件中,然后在头文件的底部放置:
#include "LinkedList.tem"
。 GCC使用了我所见过的tcc扩展名。