2012-01-06 87 views
0

即使經過多年的C++是混淆了地獄了我..我 類實現運營商+混亂(指針與參考)

virtual CStatCounter& operator= (CStatCounter const& inSC); 

virtual CStatCounter operator+(const CStatCounter& rhs); 

而且我保持

vector<CStatCounter*> mStatistics 

別的地方。現在我想要做的就是積累所有的價值。 在由STD被嘲笑後::積累,我切換到一個簡單的循環滾我自己,仍然沒有運氣:

CStatCounter *iniCounter = new CStatCounter(0); 
BOOST_FOREACH (CStatCounter *counter, mStatistics) 
{ 
    iniCounter = iniCounter+counter; 
} 

編譯器(4.2的Xcode /鐺)抱怨

Invalid operands to binary expression ('CStatCounter *' and 'CStatCounter *') 

我可以將循環體更改爲counter + counter,並且它仍然失敗並顯示相同的錯誤消息。

不應該足夠聰明地隱式轉換參考和指針嗎? 我在這裏錯過了一些微不足道的東西嗎?

+2

我很困惑,爲什麼你加符返回'bool',而不是一個'CStatCounter' – Hoons 2012-01-06 17:25:04

+0

周杰倫嗨,不回答你的問題,但如果你使用boost :: ptr_vector,而不是一個std ::指針的矢量你將迭代引用而不是指針。本來可以避免這種情況。 – Dennis 2012-01-06 17:25:56

+0

因爲..我太麻煩複制&粘貼!!!!D'OH!感謝那。應該返回一個CStatCounter當然... – Jay 2012-01-06 17:30:41

回答

4

它不應該足夠聰明地在引用 和指針之間進行隱式轉換嗎?

它可以,但不會是C++,會嗎?當你可以爲操作數的每個可能的組合重載運算符時,做出這樣的假設是不安全的。

我在這裏錯過了一些微不足道的東西嗎?

提領:

*iniCounter = *iniCounter + *counter; 

順便說一句,你仍然可以使用std ::積累,你只需要一個自定義的二進制操作,像這樣:

CStatCounter MyAddFunc(const CStatCounter & lhs, const CStatCounter * rhsp) 
{ 
    return lhs + *rhsp; 
} 

*iniCounter = std::accumulate(mStatistics.begin(), mStatistics.end(), 
           *iniCounter, MyAddFunc); 
+0

*嘆*我真的希望編譯器,可以是聰明的,如果 - 你做...回答;-) – Jay 2012-01-06 17:20:18

3

*iniCounter = *iniCounter + *counter;怎麼樣?

在附註中,您確定所有這些指針和虛擬信息都是非常必要的嗎?

+0

這是一羣派生類的基類保持實際的具體統計! – Jay 2012-01-06 17:18:17

+0

就櫃檯而言 - 恨STL一直在抄襲我的東西。在這個微不足道的場景(每個實例有一個int或double成員)可能沒有什麼可擔心的,儘管.. – Jay 2012-01-06 17:19:10

+0

如果operator +返回一個bool,這個工作嗎? – antlersoft 2012-01-06 17:25:06

2

沒有隱含的轉換。

您將不得不提供您準確使用的重載。

virtual bool operator+(const CStatCounter* rhs); 
virtual CStatCounter& operator= (CStatCounter const* inSC); 

或修改您的代碼以匹配您提供的重載。

*iniCounter = *iniCounter + *counter; 
+0

有時我討厭C++。不管怎麼說,還是要謝謝你。 – Jay 2012-01-06 17:21:25

+0

@Jay:對我來說,它通常是一個愛恨關係,大部分時間:) – 2012-01-06 17:23:21