编译模板

Compiling a template

本文关键字:编译      更新时间:2023-10-16

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

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

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

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