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%次に、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 に答える