为什么编译器可以找到其中一个操作符重载,而不能找到另一个
Why can the compiler find one of these operator overloads but not the other?
我正在尝试序列化我所做的自定义类,给出一个指向该类实例的指针。此代码无法编译,因为它无法解析operator<<(out, myObj)
.
QDataStream& operator<<(QDataStream &out, MyObj const *&m);
QDataStream& operator>>(QDataStream &in, MyObj *&m);
void MainWindow::serialize(QDataStream &out)
{
MyObj *myObj = new MyObj();
operator<<(out, myObj);
}
void MainWindow::deserialize(QDataStream &in)
{
MyObj *myObj = new myObj();
operator>>(in, myObj);
}
QDataStream &operator<<(QDataStream &out, MyObj const *&) { return out; }
QDataStream &operator>>(QDataStream &in, MyObj *&) { return in; }
编译错误如下:
MainWindow.cpp:79:33: error: call of overloaded 'operator<<(QDataStream&, MyObj*&)' is ambiguous
MainWindow.cpp:79:33: note: candidates are:
../Qt5.0.1/5.0.1/gcc_64/include/QtCore/qchar.h:395:28: note: QDataStream& operator<<(QDataStream&, QChar) <near match>
../Qt5.0.1/5.0.1/gcc_64/include/QtCore/qchar.h:395:28: note: no known conversion for argument 2 from 'MyObj*' to 'QChar'
...
有趣的是,编译器只找不到第一个操作符重载。我能够通过使用对象引用而不是对象指针的引用来修复这个问题,但我很好奇为什么这不会编译。
为什么编译器找不到第一个操作符的实现?
在呼叫operator<<
时,您试图将MyObj*
转换为MyObj const *&
。
乍一看,这似乎是有效的。毕竟,你是在添加的稳定性。但是 c++不允许。
考虑这个可能的函数实现,看看为什么。
QDataStream &operator<<( QDataStream &out, MyObj const *& refptr )
{
static const MyObj const_thing;
refptr = &const_thing;
return out;
}
这段代码将修改提供的(非const)指针MyObj *myObj
,使其指向一个被声明为const的对象。如果您想要特定的函数签名,可以通过提供指向引用的const正确指针来解决这个问题。
void serialize(QDataStream &out)
{
MyObj *myObj = new MyObj();
const MyObj *myConstObj = myObj; // THIS is the pointer that will be referenced
operator<<(out, myConstObj);
}
否则,考虑删除引用。
QDataStream& operator<<(QDataStream &out, MyObj const *m);
相关文章:
- 重载操作符+:表达式必须是整型或无作用域枚举类型
- 重载操作符
- 如何重载操作符==外模板类使用友元函数
- 重载*操作符,使其在左右两边都工作
- 重载操作符<对于非随机迭代器
- 在c++中重载操作符的时间和原因
- 如何在c++中重载=操作符来通过引用进行复制
- 如何在c++中获取定义为友元的重载操作符的地址
- 使用重载操作符的文件操作表达式没有给出预期的结果
- 重载操作符()
- 重载操作符()并在类内使用
- 类中的重载操作符+
- 定时使用重载操作符
- c++带类的重载操作符
- 用列表容器重载[]操作符
- 重载操作符=
- 任何重载操作符()的静态检测
- 重载操作符以处理类对象
- 在使用另一个类的类中重载操作符==
- 派生类和基类中的重载操作符不同