【问题标题】:ambiguous error overloading operator<< QdataStream subclass and personal class重载运算符<< QdataStream子类和个人类的模棱两可的错误
【发布时间】: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&lt;&lt; 以在适当的时候使用QDataStream 实现。所以公共继承在这里什么也买不到。

标签: c++ qt


【解决方案1】:

最后,我将遵循 KubaOber 的建议(在我的问题的 cmets 中)并使 QDataStream 成为我的类的组合,而不是继承 QDataStream。

感谢 KubaOber 的建议!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    • 2013-11-18
    • 2018-02-22
    • 2010-12-10
    • 1970-01-01
    相关资源
    最近更新 更多