-2

次のコードは、代入演算子をオーバーロードする方法を示しています。

#include <iostream>
using namespace std;

template <typename T>
class A
{
public:
    A()   {};
    A( T &obj) {value = obj;};
    ~A() {};
    T value;

    template <typename E>
    A<T>& operator = ( A<E> &obj)
    {

        if(this == &obj)
            return *this;

        value = obj.value;
        return *this;
    }

};



int main()
{
    int temp;
    temp = 3;
    A<int> myobjects(temp);
    cout<<myobjects.value<<endl;

     float f_value;
     f_value = 10.7;
     A<float> fobjects(f_value);
     myobjects = fobjects;
     cout<<myobjects.value<<endl;

    return 0;
}

ただし、VC10でコンパイルすると、次のエラーが発生します。

 error C2440: '==' : cannot convert from 'A<T> *' to 'A<T> *const '

次のようにオーバーロード関数を変更した場合:

  template <typename E>
    A<T>& operator = ( A<E> &obj)
    {

     // if(this == &obj)
        //  return *this;

        value = obj.value;
        return *this;
    }

それが動作します。この方法で呼び出されたときに、コメントアウトされたコードでこのエラーが発生するのはなぜですか?

4

1 に答える 1

1

エラーメッセージの一部が欠落しています。それは言うべきです:

error C2440: '==' : cannot convert from 'A<T> *' [with T = float] to 'A<T> *const' [with T = int]

その追加情報を確認するには、ビルドログの近くの行を確認する必要がある場合があります。そして、コンパイラーはT2回使用することによって何の恩恵も受けていませんが、2つの異なるタイプを表しています。

于 2012-07-09T17:49:10.197 に答える