Include .cpp file?
Possible Duplicate:
Why can templates only be implemented in the header file?
我最近一直在尝试C++。目前我正在尝试编程,我确信每个人都至少做过一次:一个简单的LinkedList类。代码已经完成了,但我不知何故未能编译它。我一直在谷歌搜索,似乎我把目标文件链接错了。我的代码基本上就是这样的:
测试程序
1 2 3 4 5 6 7 | #include"linkedlist.h" int main() { LinkedList<int> list; // do something } |
链接列表
1 2 3 4 5 | template <typename T> class LinkedList { // a lot of function and variable definitions } |
然后有一个名为linkedlist.cpp的.cpp文件,其中包含linkerlist类的所有实际代码。尝试使用以下命令编译test.cpp时:
1 | g++ ..\src\test.cpp |
我被告知有对"LinkedList::LinkedList()"的未定义引用。所以我一直认为链接错误,因为有多个.cpp文件,所以我尝试如下:
1 2 3 | g++ -c -Wall -O2 ..\src\test.cpp g++ -c -Wall -O2 ..\src\linkedlist.cpp g++ -s test.o linkedlist.o |
然而,这并没有改变任何事情。错误消息保持不变。我一直试图在网上找到一些信息,但是,它并没有真正发挥作用。
您正在创建一个类模板,其中有一个重要警告,即所有变量定义都必须放在头文件中,以便在编译期间所有翻译单元都可以访问这些定义。
原因是模板的工作方式。在编译期间,编译器根据类模板定义实例化模板类。它不足以只访问声明或签名:它需要有完整的定义可用。
将所有方法定义从
或者,您可以通过显式地告诉编译器使用类似于
您已经拆分了类
模板类就像一个规则的定义,通过它可以构造一个实际的类。实际类由编译器创建(实例化)在模板类实例化的任何位置。因此,此时编译器必须能看到模板类的所有代码,这就是为什么您必须在头文件中写入所有模板函数和方法的原因——因为您只包含cpp文件的头文件,所以此时编译器只能看到头文件。您不将cpp文件包含到另一个cpp文件中,并且不应该这样做。
如果我的理解错误,请纠正我。
P.S.C++ 11解决了这个问题吗?
由于
(严格地说,它们不必是,但这是绕过模板实例化复杂性的最简单方法,而不会完全偏离包含约定。)
哦,无论如何,您需要采用第二种构建方法;您应该将所有
there's an undefined reference to 'LinkedList::LinkedList()'
是否检查过LinkedList类是否具有构造函数?