2

operator=テンプレートクラスでをオーバーロードしようとしています。

私はこのテンプレートクラスを持っています:

template <class T>
class Matrice
{
    T m,n;
public:
    template <class V>
    friend Matrice<V>& operator=(const Matrice<V> &);
};

template <class T>
Matrice<T>& Matrice<T>::operator=(const Matrice<T> &M)
{
    /*...*/
    return *this;
}

そして私も試しました:

template <class T>
class Matrice
{
    T m,n;
public:
    template <class V>
    Matrice<V>& operator=(Matrice<V> &);
};

template <class T>
Matrice<T>& operator=(Matrice<T> &M)
{
    /*...*/
    return *this;
}

しかし、私はまだこのエラーが発生します:

error C2801: 'operator =' must be a non-static member
4

3 に答える 3

5

エラーC2801:'operator='は非静的メンバーである必要があります

ここで重要なのは太字の単語です。friendメンバーではありません。それは友達です。friendそのキーワードを削除しoperator=、メンバーとして扱います。

構文的に適切なバージョンは次のとおりです。

template <class T>
class Matrice
{
    T m,n;
public:
    template <class V>
    Matrice<V>& operator=(const Matrice<V> &);
};

template <class T>
template <class V>
Matrice<V>& Matrice<T>::operator=(const Matrice<V> &M)
{
    /*...*/
    return *this;
}

そこで使うのは間違っていると思いますtemplate <class V>が、意味的に適切なバージョンは

template <class T>
class Matrice
{
    T m,n;
public:
    Matrice<T>& operator=(const Matrice<T> &);
};

template <class T>
Matrice<T>& Matrice<T>::operator=(const Matrice<T> &M)
{
    /*...*/
    return *this;
}

説明:通常、この方法で割り当てる 必要はありません。あなたがしなければならないなら、それはおそらく悪いデザインの兆候です。Type<V>Type<T>

于 2012-06-23T19:38:38.233 に答える
3

標準は言う

12.8クラスオブジェクトのコピーと移動[class.copy]

..。

17ユーザーが宣言したコピー代入演算子X::operator=は、クラスXの非静的非テンプレートメンバー関数であり、タイプX、X&、const X&、volatile X&、またはconst volatile X&のパラメーターが1つだけあります。

フレンド関数はこれらの要件を満たしていません。メンバー関数である必要があります。


これは単なる「プレーン」な割り当てであり、コピーの割り当てではないというコメントに対処するために、標準から別の引用を追加しましょう。

13.5.3割り当て[over.ass]

代入演算子は、パラメーターが1つだけの非静的メンバー関数によって実装されます。

標準では、「shall」は他のことをするためのオプションを残しません。

于 2012-06-23T19:44:01.183 に答える
2

友達メンバーの宣言と定義を混在させました。最初の例ではoperator=友達として宣言しましたが、クラスメンバーとして定義しました。2番目の例ではoperator=、メンバーとして宣言しましたが、非メンバーとして定義しようとしました。メンバーoperator=である必要があり(この質問の理由を参照)、次のことができます。

template <class T>
class Matrice
{
    T m,n;
public:
    Matrice<T>& operator=(Matrice<T> &);
};

template <class T>
Matrice<T>& Matrice<T>::operator=(Matrice<T> &M)
{
    /*...*/
    return *this;
}
于 2012-06-23T19:48:59.740 に答える