[英]How to specialize a class template member function?
我有一个类模板,简化,有点像:
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;
}
};
另一个继承自这个类的类:
class B : public A<double>
{
// ...
};
但是当我这样做时,编译器说:
invalid operands of types ‘double’ and ‘const double’ to binary ‘operator%’
然后,我尝试将我的operator%
专门化为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;
}
我得到这个错误,我实际上不明白为什么......
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;
}
或者在类定义中移动它。
这是因为与“真实”模板不同,完整功能模板专业化就像链接和ODR方面的普通功能一样。 并且由于您将它专门用于任何类之外,因此它不像在类定义中定义的普通方法那样隐式声明内联。
因此,您要么声明函数内联,要么只在标题中声明它,并在源文件中定义它,就像任何普通函数一样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.