2013-12-19 40 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->修复。