2012-06-15 41 views
0

我有一個類正確重載雙等於一類從派生的std :: vector的

class Item { 
    int _one; 
    int _two; 
    int _three; 
    // other stuff 
}; 

class ItemList : public std::vector<Item> { 
    // deriving from std vector because the ctor needs to 
    // perform some work in discriminating what gets added 
    // to the list 
}; 

我讀過很多的爭論免受性病::矢量<推導>,我想我會沒問題,因爲這個類不是從派生的。我在python中使用boost向量索引套件來暴露它,以充當python列表。因爲我所需要的構造做地消除施工期間列表中某些元素的一些工作,我決定去,而不是做什麼,我已經在這個項目做過的這條路線:

class AnotherItem { 
    // class definition 
}; 
typedef std::vector<AnotherItem> AnotherItemList 

然後露出列表帶有使用typedef的提升向量索引套件。除非我有這個錯誤,否則似乎很好:錯誤2錯誤C2678:二進制'==':找不到操作符找到類型爲'Item'的左側操作數(或沒有可接受的轉換)

錯誤不是來自boost庫,而是std算法代碼中的東西。我試圖添加我自己的類重載==運算符,但這並沒有解決問題。它看起來像這樣:

class Item { 
    // earlier stuff 
    bool operator==(Item& rhs) { 
     return (_one == rhs._one && _two == rhs._two && _three == rhs._three); 
    } 
    bool operator!=(Item& rhs) { 
     return !(*this == rhs); 
    } 
}; 

這並沒有解決問題。我錯過了什麼?此鏈接here顯示vector的==運算符不是成員函數。我嘗試在「全局」級別重載(即不在名稱空間內),但這也沒有幫助。那麼,我錯過了什麼?

感謝, 安迪

+8

你的第一個問題是來自'std :: vector' .. 。不能繼承不是從繼承的類型。而是使用合成(即內部存儲'std :: vector')。 –

+4

你應該使'operator =='和'operator!='const-correct。 (即'bool operator ==(const Item&rhs)const {...') – Cornstalks

+0

除了從矢量問題繼承的問題之外,錯誤是否告訴你RHS的期望?它是否提供任何近距離比賽? – juanchopanza

回答

1

的==正確的過載是

class Item 
{ 
    ... 
    bool operator==(const Item& rhs) const 
    { .... } 

    bool operator!=(const Item& rhs) const 
    { return !(*this==rhs); } 
}; 

而且,是的,因爲std::vector沒有虛擬成員舒爾,派生ItelmList不能多態對std::vector使用本身,特別是不要針對std :: vector *調用delete。

我不得不說這是因爲,否則我和你會被塔C++ communinty在30年以上的經驗,在編程註定雖然我從來沒有從未從未看到一個std ::向量*或性病::串*。 (因此,我真的不知道派生std類的所有「恐慌」是:簡單地知道你在做什麼,並讓其他人知道)

+1

你從來沒有見過'std :: vector *'或'std :: string *'?顯然你沒有花時間閱讀noob C++的問題在這裏SO--) – Rook

+0

@Rook::-)))+1! -BTW-新手犯錯誤是正常的。什麼不是,是保護他們。在我瞭解到==和=之間的區別之後,我停止了編碼「yoda比較」(如if(0 == a)...)。 在我瞭解到虛擬與非虛擬之間的區別之後,我停止了建立非虛擬dtors。 –

+0

看起來像我有const問題。我已經記錄了我遵循這種模式和建立的東西。仍然考慮到這一點的智慧。儘管現在我的代碼已經構建完成,但我不確定它會如何保持這種狀態,因爲從std :: vector <>派生的非常嚴格的考慮。這個類不應該從派生。然後再次,我被告知我永遠不會需要超過640K的RAM。 –

相關問題