我有一个 header ,其中包含一个带有模板成员的类和该成员的一些特化:
#include <iostream>
class Foo {
public:
template<typename T>
void print(const T& t) {
std::cout << t << std::endl;
}
};
template<>
void Foo::print<int>(const int& t) {
std::cout << t << std::endl;
}
此 header 包含在多个源文件中。
如果我将特化放在类定义中,那么 GCC 会提示:
error: explicit specialization in non-namespace scope ‘class Foo’
但是如果我将特化移到类定义之外,VC++ 就会提示多重定义的符号。
两个编译器都会满意的正确方法是什么?
最佳答案
显式特化的模板函数不再是模板(它不再依赖于任何模板参数)。因此,它作为一个普通函数遵守单一定义规则。这意味着显式特化函数的定义应该在整个程序中进行一次且仅一次。 IE。您必须将定义放入实现文件(.cpp
文件)。
但是,您仍然必须在头文件中声明此特化(以告诉编译器它确实存在)。 IE。在你必须做的头文件中
template<>
void Foo::print<int>(const int& t);
(请注意,根据标准要求,它应该在命名空间范围内完成,即在类定义之外。)
然后在一个实现文件中做
template<>
void Foo::print<int>(const int& t) {
std::cout << t << std::endl;
}
附言当然,就像任何其他函数一样,您可以将其声明为内联
并将定义保留在头文件中。
关于c++ - 类模板成员的特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25758746/