【发布时间】:2018-06-29 01:23:52
【问题描述】:
我正在使用 Qt 5.10,我必须将 QDatastream 子类化,并将运算符
class myDataStream:public QDataStream
{
public :
myDataStream(QIODevice* device):QDataStream(device)
{}
};
class data
{
public:
data(double v):data_(v) {}
double getData() const {return data_;}
void record(myDataStream& stream) const;
private:
double data_;
};
void data::record(myDataStream &stream) const
{
stream<<getData();
}
myDataStream &operator<<(myDataStream &stream, const data &d )
{
stream<<d.getData(); //<------ Error here
return stream;
}
我有这个错误:
> error: use of overloaded operator '<<' is ambiguous (with operand types 'myDataStream' and 'double')
当我像这样删除数据后面的 const 运算符时:
myDataStream &operator<<(myDataStream &stream, data &d )
{
stream<<d.getData();
return stream;
}
我没有错误。 operator
我不明白。
有人帮我吗?
【问题讨论】:
-
@eyllanesc,我不认为这是同一个问题。我不认为 operator
-
QDataStream 本质上是一个最终类。你为什么要对它进行分类?它并不是真正设计为子类化的。如果您想要一个将某些实现交给
QDataStream的自定义流,您应该使用组合或私有继承——您的类不再是QDataStream。然后,您的流操作员可以根据需要转发到 QDS 实施。编译器正在给你一个微妙的提示。当然,编译器错误有一个“修复”,但它只是掩盖了您的基本设计错误。 -
@Kuba Ober,但如何解释错误?
-
@vcloarec 没有提供专门化基类的钩子。您的类违反了 Liskov 替换原则,并且只要其用户最终通过基类类型访问它,它就会完全失败。当然,这与 Qt 无关。您正在创建一个只有在派生类型访问时才能正确运行的类——这不是“专业化”,而是纯粹的破坏。没有什么可以阻止您进行私有继承。您通常可以转发
operator<<以在适当的时候使用QDataStream实现。所以公共继承在这里什么也买不到。