在此代码中:
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>&
。
答案 0 :(得分:16)
operator->()
有点奇怪:虽然它可以返回非指针类型,但结果类型也需要重载operator->()
!基本上,当编译器看到使用重载operator->()
时,它将继续应用operator->()
,直到结果为指针。一旦获得指针,它就知道如何访问相应的成员。
如果重复应用operator->()
导致非指针类型不会超载operator->()
,则会出错。
答案 1 :(得分:0)
我很傻,而一个更有用的错误本来就很好我错误地重载 - &gt;。
C ++尝试做的最好的解释是Jrok的回答:the operator-> return value of smart pointers
我只是从T*
返回T&
而不是operator->
来修复。