2012-01-20 83 views
1

嵌套類不會自動合成。如果我嘗試編譯:爲什麼運營商==在C++

class Outer 
{ 
    class Inner 
    { 
     int t; 
    }; 
public: 
    Inner inner_; 
    bool operator ==(Outer rightSide); 
}; 

bool Outer::operator ==(Outer rightSide) 
{ 
    if (inner_ == rightSide.inner_) 
     return true; 
    return false; 
} 

我得到一個錯誤:

/home/martin/Projects/Experimentation/Various-build-desktop/../Various/main.cpp:18: 
error: no match for ‘operator==’ in ‘((Outer*)this)->Outer::inner_ == 
rightSide.Outer::inner_’ 

請,只是我做錯了什麼或者這是C++

屬性

編輯:

哦,我從來沒有意識到的是,操作符==是從來沒有合成過,我確信它是合成的,我沒有麻煩去檢查。
謝謝Parapura Rajkumar!

+8

''==從不自動合成...內部類爲什麼會是任何異常 –

+1

首先,它應該只是'回inner_ == rightSide.inner_',其次是的,它不會爲你合成,因爲它的含義是模棱兩可的。 – Phonon

+0

你爲什麼期望編譯器給你隱式運算符?參看這個問題http://stackoverflow.com/questions/217911/why-dont-c-compilers-define-operator-and-operator – Useless

回答

2

比較運算符永遠不會隱式生成。只有這些東西是:

  • 默認的構造,
  • 析構函數,
  • 複製和移動的構造,
  • 拷貝分配新建分配FY和移動賦值操作符

如果你希望能夠爲了比較你的類型,你必須編寫你自己的比較運算符。如果您將其作爲成員實施,則應聲明const;否則,將無法比較常量對象。您也可以考慮將參數作爲常量引用來避免不必要的複製;對於這些類型的簡單類型幾乎沒有什麼區別,但對於大型或複雜類可以更有效。喜歡的東西:

bool Outer::operator==(Outer const & rhs) const { 
    return inner_.t == rhs.inner_.t; 
} 

或作爲非成員函數:

bool operator==(Outer const & lhs, Outer const & rhs) { 
    return lhs.inner_.t == rhs.inner_.t; 
} 
+1

和析構函數。 –

+0

@phresnel:謝謝,我忘記了。 –

+0

@phresndl析構函數總是生成的 – codekiddy

1

您沒有爲class Inner定義operator==。所以,你的代碼應該是:

class Outer 
{ 
    class Inner 
    { 
     int t; 
    public: 
     bool operator == (Inner inner) 
     { 
      return t == inner.t; 
     } 
    }; 
public: 
    Inner inner_; 
    bool operator == (Outer rightSide); 
}; 

bool Outer::operator == (Outer rightSide) 
{ 
    return inner_ == rightSide.inner_; 
} 
+0

謝謝!有用。 –

+0

實際上,這不是**運營商應該怎麼看,但他們應該怎麼看!爲了讓_should_看起來像你想讓它們成爲非成員,並且可能採用'const&'參數。前者支持對稱轉換,後者用於性能並適用於「const」左手參數。 –