为什么C++模板定义需要在标题中?

Eri*_*fer 2 c++ templates

可能重复:
为什么模板类的实现和声明应该在同一个头文件中?

例如,在定义模板类时,为什么类方法的实现需要在头文件中?为什么它们不能在实现文件(cpp/cxx)中?

Eri*_*rik 12

模板类不是类,它是可用于创建类的模板.例如MyTemplate<int>,当您实例化这样的类时,编译器会在现场创建类.为了创建它,它具有看到所有的模板的成员函数(因此,它可以使用模板来创建实际构件的功能,例如MyTemplate<int>::foo()),因此,这些模板的成员函数必须在头中.

如果成员不是在标题中,编译器会简单地认为它们的存在别的地方,刚刚从模板函数声明创建实际的函数声明,这给你链接错误.

"export"关键字应该可以解决这个问题,但很少有编译器支持它(我只知道Comeau).

您还可以显式实例化MyTemplate<int>- 然后编译器将MyTemplate<int>在编译包含MyTemplate成员函数定义模板的cpp文件时创建实际的成员函数.

  • "模板类不是类" - 这就是为什么我们应该把它称为"类模板",而不是问题中的"模板类". (2认同)