2012-07-09 34 views
-2

以下代碼試圖展示如何重載賦值操作符:賦值運算符重載 - 錯誤C2440: '==':不能轉換從 'A <T> *' 到 'A <T> * const的'

#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; 
    } 

它會工作。當以這種方式調用此註釋代碼時,爲什麼會發生此錯誤?

+0

http://stackoverflow.com/questions/11399832/why-operator-overloading-fails – 2012-07-09 17:39:55

+3

@crashmstr,他不是,他在使用'=='操作符來檢查對象身份之前做任務。 – 2012-07-09 17:41:12

+1

這已在您上一個問題的評論中得到解答。花一點時間閱讀答案和評論。提示,因爲'T'和'E'不能是同一類型,所以這個測試永遠不會是'true'。 – 2012-07-09 17:41:48

回答

1

您缺少部分錯誤消息。應該說:

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

您可能需要查看構建日誌中的附近行以查看額外的信息。編譯器通過兩次使用T但沒有任何好處,但代表兩種不同的類型。

相關問題