关于c ++:包含.cpp文件?

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文件中移出,放入.h文件中,一切都应该正常(假设您实际上已经为默认构造函数提供了定义!).

或者,您可以通过显式地告诉编译器使用类似于template class LinkedList的东西来实例化适当的模板类来绕过这个问题,但在这种简单的情况下,这确实是不必要的。与在头文件中包含所有定义相比,这种方法的主要优点是它可能减少代码膨胀并加快编译速度。但这可能根本就不是必要的,因为编译器在应用适当的优化方面已经变得更聪明了。


您已经拆分了类LinkedList,并将声明放在头文件中,将定义放在源文件中。这对模板不起作用。两者都必须在标题中。


模板类就像一个规则的定义,通过它可以构造一个实际的类。实际类由编译器创建(实例化)在模板类实例化的任何位置。因此,此时编译器必须能看到模板类的所有代码,这就是为什么您必须在头文件中写入所有模板函数和方法的原因——因为您只包含cpp文件的头文件,所以此时编译器只能看到头文件。您不将cpp文件包含到另一个cpp文件中,并且不应该这样做。

如果我的理解错误,请纠正我。

P.S.C++ 11解决了这个问题吗?


由于LinkedList是一个类模板,其成员函数的定义应该放在头中。

(严格地说,它们不必是,但这是绕过模板实例化复杂性的最简单方法,而不会完全偏离包含约定。)

哦,无论如何,您需要采用第二种构建方法;您应该将所有.cpp文件链接在一起,或者使用-c开关一次编译一个文件,然后稍后将结果链接在一起。


there's an undefined reference to 'LinkedList::LinkedList()'

是否检查过LinkedList类是否具有构造函数?