2

我有一个类模板,它是简化的,有点像这样:

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%的 for doublefloat专门化,因为 % 对于这些类型似乎是不可能的。我在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
4

2 回答 2

7

如果您在类之外实现了专业化,则它不再是内联的,因此它将被定义多次。将其标记为内联:

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

或将其移动到类定义中。

于 2013-02-14T10:24:15.990 回答
3

这是因为与“真实”模板不同,全功能模板特化在链接和 ODR 方面与普通功能类似。而且由于您在任何类之外对其进行了专门化,因此它不像在类定义中定义的普通方法那样隐式声明为内联。

因此,您要么必须内联声明函数,要么只在头文件中声明它并像任何普通函数一样在源文件中定义它。

于 2013-02-14T10:25:28.000 回答