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

时间:2013-12-19 17:31:05

标签: c++ c++11

在此代码中:

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);以及与之相关的const定义。

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

LogListener有一个虚拟方法onNewMessage

所以listeners[k]PtrWrapper<LogListener>&

2 个答案:

答案 0 :(得分:16)

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

如果重复应用operator->()导致非指针类型不会超载operator->(),则会出错。

答案 1 :(得分:0)

我很傻,而一个更有用的错误本来就很好我错误地重载 - &gt;。

C ++尝试做的最好的解释是Jrok的回答:the operator-> return value of smart pointers

我只是从T*返回T&而不是operator->来修复。