c++ - 类模板成员的特化

标签 c++ templates template-specialization

我有一个 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/

相关文章:

c++ - 正确转发到动态分配数组的特化

c++ - 处理 C++ 类中的惰性计算

c++ - 从 Windows 系统菜单中删除“移动”和“关闭”命令,而不会丢失功能

c++ - 匹配别名模板作为模板参数

c++ - 如何通过未定义类型定义元函数?

c++ - 关于自定义分配器和 STL 的模板声明、别名和特化说明

c++ - 跟踪一个对象在 X 个对象之间的变量变化

c++ - 在这种情况下,数组 a 会被取消分配吗?

c++ - 需要一个虚拟模板成员解决方法

c++ - 模板中的隐式转换和编译器强制