C++专门化单成员函数

C++ Specializing single member function

本文关键字:成员 函数 专门化 单成员 C++      更新时间:2024-09-27

类模板成员专业化的问题。

我有一个简单的类,我想专门化一个单成员函数。我是这样做的:

template <class T>
class Object
{
public:
Object() {}
void print() const
{
std::cout << "It's the template" << std::endl;
}
// ...
};
template<>
void Object<int>::print() const
{
std::cout << "It's an int" << std::endl;
}

这最终导致成员函数的多个定义的编译错误。

如果只有一个源文件包含头,那么一切都很好。

如果两个文件包括标题,我会得到以下错误:

/home/marc/QtProjects/QtAsp服务/build-asspservice-Desktop_Qt_5_15_0_GCC_64bit-Debug//src/Asp/aspobject.h:34:Fehler:"Asp2::print(("的多重定义;main.o:/home/marc/QtProjects/QtAsp Service/build-asspservice-Desktop_Qt_5_15_0_GCC_64bit-Debug//src/Asp/aspobject.h:34:此处首次定义

这通常是可能的吗?如果是,那是怎么回事。

您的方法是正确的,但完全专业化的成员不再是模板,因此不再隐式内联。

如果在头中保留定义,或者拆分声明(在头中(和定义(在cpp中(,则必须添加inline

template<>
inline void Object<int>::print()
{
std::cout << "It's an int" << std::endl;
}

问题是模板类是在一个单独的头文件中定义的。如果只有一个源文件包含标头,它就可以工作。如果两个或多个源文件包含标头,GCC将抛出多重定义错误。还有别的办法吗?