2013-12-19 61 views
1

在此代碼:結果的「操作符 - >()」產生非指針結果

while(k != listeners.getLength()) { 
    if(listeners[k] != nullptr) { 
     listeners[k]->onNewMessage(*newMessage); 
    } 
    k++; 
} 

編譯器不喜歡->在所有。

listeners[k]是一個帶有operator->()的類,它既是公共的,也是定義的,它返回一個帶有(虛擬)方法onNewMessage的類型的引用。

將其更改爲:

while(k != listeners.getLength()) { 
    if(listeners[k] != nullptr) { 
     listeners[k].operator ->().onNewMessage(*newMessage); 
    } 
    k++; 
} 

作品。

使用工作。我添加了一些布爾運算符(==!=到參考listeners[k]返回的類型)。我還爲::std::nullptr_t類型添加了構造函數。我看不到任何這些會導致問題的原因,並且錯誤沒有提到任何含糊之處,因此它不是有太多選擇。

爲什麼這裏有問題?

補遺

爲了闡明結構如下:

List<PtrWrapper<LogListener>> listeners; 

T& List<T>::operator[](int);和一個常量定義與它去。

T& PtrWrapper<T>::operator->();和一個與它一起使用的const版本。

LogListener有一個虛擬方法onNewMessage。因此listeners[k]PtrWrapper<LogListener>&

+1

你可以發佈這個'operator - >()'的定義嗎?如果它返回一個引用,你不應該使用'listeners [k] .onNewMessage(...)'? – Praetorian

+0

如果你打算在後綴表達式中使用它,它需要返回一個指針類型。請參閱[這裏](http://stackoverflow.com/questions/20583450/the-operator-return-value-of-smart-pointers/20583499#20583499)。 – jrok

+0

「產生非指針結果」你的第二個例子有'.onNewMessage',這樣就不會產生指針結果。什麼是編譯器錯誤消息?你的'operator->'函數原型是什麼? – OmnipotentEntity

回答

15

operator->()有點奇怪:雖然它可以返回一個非指針類型,但結果類型也需要重載operator->()!基本上,當編譯器看到使用超載的operator->()時,它將繼續應用operator->(),直到結果爲指針。一旦獲得指針,它就知道如何訪問相應的成員。

如果operator->()的重複應用導致非過載的非指針類型operator->(),這是錯誤的。

0

我正在愚蠢,而更有用的錯誤本來不錯,我糾結了超載 - >。

++試圖做什麼C的最好的解釋是羅的回答是:the operator-> return value of smart pointers

我只是回到T*而不是T&operator->修復。