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

Hai*_*ang 38 c++ templates

为什么模板类的实现和声明应该在同一个头文件中?你能不能通过例子解释一下?

Pra*_*rav 25

编译器需要访问整个模板定义(而不仅仅是签名)才能为模板的每个实例化生成代码,因此您需要将函数的定义移动到标题中.

有关更多详细信息,请参阅包含模型.


Ant*_*ams 6

类模板的定义及其成员函数的实现必须对于使用不同类型实例化它的每个地方都是可见的.即为了实例化myTemplate<int>你需要看到完整的定义和实现myTemplate.

最简单的方法是将模板及其成员函数的定义放在同一个标​​题中,但还有其他方法.例如,您可以将成员函数实现放在单独包含的单独文件中.然后,您可以从第一个标头中包含它,或者只包含您需要它的实现文件.

例如,一种做法是在一个.cpp文件中为不同的参数集显式实例化一个模板,并extern在头文件中声明这些实例.这样,这些实例化可以在其他源文件中使用,而不需要实现模板成员函数.但是,除非您包含实现文件,否则您将无法使用其他模板参数集.

即如果你有myTemplate<int>myTemplate<std::string>定义为extern那么你可以使用它们,但如果myTemplate<double>没有定义,extern那么你不能使用它没有实现.