C++ 如何专门化类模板成员函数?
我有一个类模板,简化后有点像:C++ 如何专门化类模板成员函数?,c++,templates,C++,Templates,我有一个类模板,简化后有点像: template<typename T> class A { protected: T _data; public: A* operator%(const A &a2) const { A * ptr; ptr = new A(this->_data % a2._data); return ptr; } }; 然后,我尝试将我的操作符%专门化为double
template<typename T>
class A
{
protected:
T _data;
public:
A* operator%(const A &a2) const
{
A * ptr;
ptr = new A(this->_data % a2._data);
return ptr;
}
};
然后,我尝试将我的操作符%
专门化为double和float,因为%似乎不可能用于这些类型。我在A类声明之后添加了以下代码
template<>
A* A<double>::operator%(const A &a2) const
{
A * ptr;
ptr = new A((uint32_t)this->_data % (uint32_t)a2._data);
return ptr;
}
模板
A*A::运算符%(常数A和a2)常数
{
A*ptr;
ptr=新的A((uint32_t)此->_数据%(uint32_t)a2._数据);
返回ptr;
}
我得到这个错误,我真的不明白为什么
In function `A<double>::operator%(A const&) const':
./include/A.hpp:102: multiple definition of `A<float>::operator%(A const&) const'
src/Processor.o:./include/A.hpp:102: first defined here
函数“A::operator%(A const&)const”中的:
./include/A.hpp:102:A::operator%(A const&)const的多重定义
src/Processor.o:./include/A.hpp:102:首先在此处定义
如果您在类之外实现了专门化,它将不再是内联的,因此将被多次定义。将其标记为内联:
template<>
inline A* A<double>::operator%(const A &a2) const
{
A * ptr;
ptr = new A(this->_data % a2._data);
return ptr;
}
模板
内联A*A::运算符%(常量A和a2)常量
{
A*ptr;
ptr=新的A(此->_数据%a2._数据);
返回ptr;
}
或者将其移动到类定义中。这是因为与“真实”模板不同,完整函数模板专门化在链接和ODR方面与普通函数类似。由于您在任何类之外对其进行了专门化,因此它不像在类定义中定义的普通方法那样隐式声明为内联
因此,您要么以内联方式声明函数,要么仅在头文件中声明函数,并像任何普通函数一样在源文件中定义它
In function `A<double>::operator%(A const&) const':
./include/A.hpp:102: multiple definition of `A<float>::operator%(A const&) const'
src/Processor.o:./include/A.hpp:102: first defined here
template<>
inline A* A<double>::operator%(const A &a2) const
{
A * ptr;
ptr = new A(this->_data % a2._data);
return ptr;
}