我正在尝试序列化我已经创建的自定义类,给出了指向该类实例的指针。此代码无法编译,因为它无法解析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'
...
有趣的是,编译器只能找不到第一个运算符重载。我能够通过使用对象引用而不是对对象指针的引用来解决这个问题,但我很好奇为什么这不会编译。
为什么编译器无法找到第一个运算符的实现?
答案 0 :(得分:1)
在致电operator<<
时,您正试图将MyObj*
投放到MyObj const *&
。
乍一看,这看起来很有效。毕竟,你添加 const-ness。但 C ++不允许。
考虑这个函数的可能实现,以了解原因。
QDataStream &operator<<( QDataStream &out, MyObj const *& refptr )
{
static const MyObj const_thing;
refptr = &const_thing;
return out;
}
此代码将修改提供的(非常量)指针MyObj *myObj
,现在指向声明为const 的对象。
如果你想要那个特定的函数签名你可以通过提供一个const-correct指向引用来解决这个问题。
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);