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>&
。
你可以發佈這個'operator - >()'的定義嗎?如果它返回一個引用,你不應該使用'listeners [k] .onNewMessage(...)'? – Praetorian
如果你打算在後綴表達式中使用它,它需要返回一個指針類型。請參閱[這裏](http://stackoverflow.com/questions/20583450/the-operator-return-value-of-smart-pointers/20583499#20583499)。 – jrok
「產生非指針結果」你的第二個例子有'.onNewMessage',這樣就不會產生指針結果。什麼是編譯器錯誤消息?你的'operator->'函數原型是什麼? – OmnipotentEntity