包括.cpp文件?

hai*_*yyu 14 c++ linker templates

可能重复:
为什么模板只能在头文件中实现?

我最近一直在尝试使用C++.目前我正在尝试编写一些我确定至少已经完成过一次的东西:一个简单的LinkedList类.代码完成了,但我不知道怎么编译它.我一直在谷歌搜索,似乎我正在链接目标文件错误.这就是我的代码基本上是这样的:

TEST.CPP

#include "linkedlist.h"

int main()
{
    LinkedList<int> list;
    // do something
}
Run Code Online (Sandbox Code Playgroud)

linkedlist.h

template <typename T>
class LinkedList
{
   // a lot of function and variable definitions
}
Run Code Online (Sandbox Code Playgroud)

然后是一个名为linkedlist.cpp的.cpp文件,其中包含LinkerList类的所有实际代码.尝试使用以下命令编译test.cpp时:

g++ ..\src\test.cpp
Run Code Online (Sandbox Code Playgroud)

我被告知有一个未定义的引用'LinkedList :: LinkedList()'.所以我一直认为它被链接错误,因为有多个.cpp文件,所以我尝试了这样:

g++ -c -Wall -O2 ..\src\test.cpp
g++ -c -Wall -O2 ..\src\linkedlist.cpp
g++ -s test.o linkedlist.o
Run Code Online (Sandbox Code Playgroud)

但是,这并没有改变任何事情.错误消息保持不变.我一直试图在互联网上找到一些信息,然而,它并没有真正解决.

Cod*_*ray 5

您正在创建一个类模板,其中有一个重要的警告,即所有变量定义必须放在头文件中,以便在编译期间所有翻译单元都可以访问它们.

原因是模板的工作方式.在编译期间,编译器根据您的类模板定义实例化模板类.它只能访问声明或签名是不够的:它需要提供整个定义.

将所有方法定义移出.cpp文件并移入.h文件中,一切都应该没问题(假设您实际上已经提供了默认构造函数的定义!).

或者,您可以通过明确告诉编译器使用类似的东西来实例化相应的模板类来解决这个问题template class LinkedList<int>,但在这种简单的情况下,这实际上并不是必需的.这包括头文件中的所有定义的主要优点是它可能减少代码膨胀并加速编译.但它可能根本没有必要,因为编译器在应用适当的优化方面已经变得更加聪明.

  • `export`关键字不再存在,之前只是模糊地支持. (2认同)