2

除非我为我编写和使用的每个模板化类/方法/函数包含一个显式模板实例化,否则我的任何一个 C++ 项目都会生成链接器错误。

STL 类似乎没有这样的问题。

是否有一些简单的行为准则(双关语)我可以遵守允许像 STL 那样的延迟实例化?

感谢收听。

4

3 回答 3

8

对于模板,您需要将所有模板代码和方法放入标头而不是源文件中。标准库就是这样做的。

于 2011-09-30T19:03:03.547 回答
1

您应该将模板的大部分内容放在头文件中。这同样适用于模板类以及普通类中的模板函数。

您应该知道的例外情况是,当您特化模板时,您需要将特化放在 implementation/.cpp 文件中,因为特化是具体类型。另一方面,实际的模板定义将需要多次运行,每个模板参数类型都需要与模板一起使用 - 所以它们必须放在头文件中(它们不是具体的类型)。

例如放:

template typename<T> foo(T val) { std::cerr << "DEFAULT"; }

在头文件及其对 int 的特化中:

template<> foo<int>(int val) { std::cerr << "INT"; }

在 cpp 文件中,因为 int 版本是一个具体的、完全定义的函数,而 T 版本是一个模板定义,它将被多次使用以生成许多具体函数。

于 2011-09-30T19:24:58.163 回答
1

大多数情况下,模板类完全在头文件中定义。如果编译器尚未遇到您正在使用的函数和模板参数的组合,这允许编译器动态生成代码主体。

您仍然可以使用带有单独的头文件和实现文件的模板,但它不太方便。正如您所发现的,您必须预测每个模板参数并将该组合放入实现文件中,以便编译器可以生成必要的代码。

于 2011-09-30T19:33:51.803 回答