'operator - >()'的结果产生非指针结果

Ale*_*eal 2 c++ c++11

在这段代码中:

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

编译器根本不喜欢它->.

listeners[k]是一个具有operator->()公共和定义的类,返回对具有(虚拟)方法的类型的引用onNewMessage.

将其更改为:

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

作品.

曾经工作过.我添加了一些布尔运算符(==以及!=引用返回的类型listeners[k]).我还为一个::std::nullptr_t类型添加了一个构造函数.我看不出为什么这些会导致问题的任何原因,错误提到没有歧义,所以它不是有太多的选择.

为什么这里有问题?

附录

澄清结构如下:

List<PtrWrapper<LogListener>> listeners;
Run Code Online (Sandbox Code Playgroud)

T& List<T>::operator[](int); 以及与之相关的const定义.

T& PtrWrapper<T>::operator->(); 和一个const版本一起去.

LogListener有一个虚方法onNewMessage.

所以listeners[k]是一个PtrWrapper<LogListener>&.

Die*_*ühl 16

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

如果重复将operator->()引线应用于不过载的非指针类型,则会出错operator->().