2012-02-21 87 views
-1

我創建了一個簡單的模板。它給了我一個警告:「不返回,函數返回非空」。C++模板錯誤,無返回,函數返回非空

template<typename T> struct test { 
public: 
    test & operator=(const T & new_value) { 
     value = new_value; 
    } 
    operator T() const { 
     return value; 
    } 
private: 
    T value; 
}; 

警告在

test & operator=(const T & new_value) { 
    value = new_value; 
} 

指着任何人都可以提供關於如何解決此警告一些建議。

+11

呃..還有東西嗎? (可能是'* this') – ildjarn 2012-02-21 21:56:30

+0

謝謝,它現在有效。如果我返回*這個,它實際上返回了什麼? – 2607 2012-02-21 21:58:13

+6

我認爲是時候用[好書](http://stackoverflow.com/q/388242/636019)開始...... – ildjarn 2012-02-21 21:59:19

回答

2

正如警告所說的,你的函數沒有返回任何東西,即使它承諾返回一個test &。只需使用return *this;就可以結束您的功能,這與分配操作員的慣例相同。

1

operator=函數假設要返回對test類型的對象的引用時,它不返回任何內容。因此,改變這種:

test& operator=(const T & new_value) 
{ 
    value = new_value; 
} 

要這樣:

test& operator=(const T & new_value) 
{ 
    value = new_value; 

    //dereference the "this" pointer to get a lvalue reference to 
    //the current object 
    return *this; 
} 

注意,通過訪問類的隱含this指針(即是指向實例類本身在內存的方法指針被調用),並取消引用它,你正在訪問類實例的左值引用。因此,如果您從類方法返回一個左值引用,那麼可以將該引用傳遞給其他引用參數的函數,並且/或者可以在該返回的類實例上調用其他方法。這允許operator=用於函數和方法調用的「鏈」中,在調用operator=方法之後,將在生成的修改對象實例上調用另一個方法。例如,你可以這樣做:如果你創造了一個print()方法爲您test對象

test<int> a; 
a.value = 5; 

int b = (a = 6) + 5; //outputs the value 11 

,你也可以做類似如下:

test<int> a; 
a.value = 7; 
(a = 8).print(); 

此代碼返回test類在operator=方法後面的實例a,然後在該實例上調用print()方法,打印出值8

0

你的編譯器告訴你你的operator = overload是不正確的。編寫一個operator = overload函數需要你遵循一個特定的格式。

Test & Test::operator=(const Test & r) 
{ 
    if(this != &r) 
    { 
     // copy member variables and initialize here 
     m_MemberVar = r.m_MemberVar; 
     ... 
    } 

    return *this; 
} 

NB

  1. 您必須返回*這一點。
  2. 這是很好的做法,以確保您避免複製的對象本身

    if(this != &r){...} 
    
  3. 如果重載operator =一個對象,你幾乎肯定會需要提供一份constuctor了。例如

    Test::Test(const Test & r){...} 
    

編輯

你會問:「如果我回到*這,這是什麼實際上將返回」 嘛,它返回到當前對象的引用。例如。在上面的operator = overload定義中,返回類型聲明爲Test &(測試對象引用)。