gpt4 book ai didi

c++ - ‘operator->()’ 的结果产生非指针结果

转载 作者:太空狗 更新时间:2023-10-29 23:25:30 24 4
gpt4 key购买 nike

在这段代码中:

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

编译器不喜欢 ->完全没有。

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

将其更改为:

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

有效。

曾经有效。我添加了一些 bool 运算符( ==!=listeners[k] 的引用返回的类型)。我还为 ::std::nullptr_t 添加了一个构造函数类型。我看不出这些会导致问题的任何原因,并且错误中没有提到任何歧义,所以并不是因为它有太多选项。

为什么这里有问题?

附录

理清结构如下:

List<PtrWrapper<LogListener>> listeners;

T& List<T>::operator[](int);以及一个常量定义。

T& PtrWrapper<T>::operator->();以及与之配套的 const 版本。

LogListener有一个虚方法 onNewMessage .

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

最佳答案

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

重复应用operator->()是错误的导致不重载的非指针类型 operator->() .

关于c++ - ‘operator->()’ 的结果产生非指针结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20688066/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com