如何专门化一个类模板成员函数?

时间:2013-02-14 10:22:56

标签: 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;
    }
};

另一个继承自这个类的类:

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

2 个答案:

答案 0 :(得分:7)

如果您在课外实现了专门化,则它不再内联,因此将多次定义。将其标记为内联:

template<>
inline A* A<double>::operator%(const A &a2) const
{
    A * ptr;
    ptr = new A(this->_data % a2._data);
    return ptr;
}

或在类定义中移动它。

答案 1 :(得分:3)

这是因为与“真实”模板不同,完整功能模板专业化就像链接和ODR方面的普通功能一样。由于您将它专门用于任何类之外,因此不会像在类定义中定义的普通方法那样隐式声明内联。

因此,您要么声明函数内联,要么只在标题中声明 ,并在源文件中定义,就像任何正常函数一样。