在这段代码中:
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->().
| 归档时间: |
|
| 查看次数: |
1601 次 |
| 最近记录: |