编译模板

时间:2013-09-15 11:47:21

标签: c++ templates

我的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;
}

1 个答案:

答案 0 :(得分:1)

使用模板时,您的整个实现必须始终可见所有实现它的文件。即如果你在标题中有你的类声明,那么定义也必须在那个标题的“内部”(见下文)。

这是因为编译器无法知道哪些类型可能会使用它,因此无法为该类型保留内存(想想它是否曾尝试为每种类型创建一个LinkedList;世界上没有足够的内存来去做!)。因此,只有在您决定在代码体中实例化时才会定义特定类型的类。如果你从不使用该类,那么它只是纯文本,程序的大小也不会更大。

在头文件中隐藏您的实现有一些技巧,例如将它们放在名为“LinkedList.tem”或“LinkedList.tcc”等的文件中,然后在头文件的底部放置: #include "LinkedList.tem"。 GCC使用了我所见过的tcc扩展名。