C++ 结果‘;操作员->;()’;产生非指针结果

C++ 结果‘;操作员->;()’;产生非指针结果,c++,c++11,C++,C++11,在此代码中: while(k != listeners.getLength()) { if(listeners[k] != nullptr) { listeners[k]->onNewMessage(*newMessage); } k++; } 编译器根本不喜欢-> listeners[k]是一个带有运算符->()的类,该运算符既是公共的又是已定义的,使用(虚拟)方法onNewMessage返回对类型的引用 将其更改为: while(k != li

在此代码中:

while(k != listeners.getLength()) {
    if(listeners[k] != nullptr) {
        listeners[k]->onNewMessage(*newMessage);
    }
    k++;
}
编译器根本不喜欢
->

listeners[k]
是一个带有
运算符->()
的类,该运算符既是公共的又是已定义的,使用(虚拟)方法
onNewMessage
返回对类型的引用

将其更改为:

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

用于工作。我添加了一些布尔运算符(
=
!=
到通过引用
侦听器[k]
返回的类型)。我还为
::std::nullptr\t
类型添加了一个构造函数。我看不出这些会导致问题的任何原因,并且错误没有提到任何模糊性,所以不是因为它有太多的选项

为什么这里有问题

附录

澄清结构如下:

List<PtrWrapper<LogListener>> listeners;
列出侦听器;
T&List::operator[](int)
和与之配套的常量定义

T&ptrwraper::operator->()
和与之配套的常量版本

LogListener
有一个虚拟方法
onNewMessage

因此,
listeners[k]
是一个
ptrwraper&

操作符->()有点奇怪:虽然它可以返回非指针类型,但结果类型也需要重载
操作符->()
!基本上,当编译器看到重载的
运算符->()
的使用时,它将继续应用
运算符->()
s,直到结果是指针。一旦获得指针,它就知道如何访问相应的成员


如果重复应用
运算符->()
导致非指针类型不会重载
运算符->()
这是一个错误,我很傻,而一个更有用的错误是我搞错了重载->

< C++试图解释的最好解释是Jrok的回答:


我只是从
operator->
返回了
T*
,而不是
T&
,以进行修复。

您能发布此
operator->()的定义吗?如果它返回引用,是否应该使用
侦听器[k].onNewMessage(…)
?如果要在后缀表达式中使用它,它需要返回指针类型。请参阅“生成非指针结果”,您的第二个示例具有
.onNewMessage
,因此也不会生成指针结果。编译器错误消息是什么?你的
操作符->
的函数原型是什么?@Praetorian补充道,我没有给出函数体,因为它们不相关,这会有很多代码。@AlecTeal
T&ptrRapper::operator->()
应该是
T*ptrRapper::operator->()