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