0

我的 LinkedList 实现中有两个分支。Master 是一个简单的,只适用于整数数据类型。而 _templates 是用模板设计的,可以为任何数据类型提供服务。

我的主分支完美地编译了这个:

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;
}
4

1 回答 1

1

使用模板时,您的整个实现必须始终可见所有实现它的文件。即,如果您的类声明位于标头内,则定义也必须位于该标头的“内部”(见下文)。

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

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

于 2013-09-15T12:31:41.910 回答