C++ 重载运算符时出现不明确错误<&书信电报;QdataStream子类和personal类

C++ 重载运算符时出现不明确错误<&书信电报;QdataStream子类和personal类,c++,qt,C++,Qt,我正在使用Qt5.10,我必须对QDatastream进行子类化,并使操作符过载最后,我将遵循KubaOber的建议(在对我的问题的评论中),使QDatastream成为我类的组成部分,而不是对QDatastream进行子类化 感谢KubaOber的建议 可能是@eyllanesc的重复,我认为这不是同一个问题。我不认为operatorQDataStream本质上是一个最终类。你为什么要把它分类?它并不是真正设计成子类的。如果您希望自定义流将某些实现交给QDataStream,则应使用组合或私有

我正在使用Qt5.10,我必须对QDatastream进行子类化,并使操作符过载最后,我将遵循KubaOber的建议(在对我的问题的评论中),使QDatastream成为我类的组成部分,而不是对QDatastream进行子类化


感谢KubaOber的建议

可能是@eyllanesc的重复,我认为这不是同一个问题。我不认为operatorQDataStream本质上是一个最终类。你为什么要把它分类?它并不是真正设计成子类的。如果您希望自定义流将某些实现交给
QDataStream
,则应使用组合或私有继承-您的类不再是
QDataStream
。然后,您的流运营商可以根据需要转发到QDS实现。编译器会给你一个微妙的提示。当然,编译器错误有一个“修复”,但它只掩盖了基本的设计缺陷。@Kuba Ober,但如何解释错误?@vcloarec没有提供专门化基类的钩子。您的类违反了Liskov替换原则,当用户最终通过基类类型访问它时,它将完全失败。当然,这与Qt无关。您正在创建一个只有在被派生类型访问时才能正确运行的类——这不是“专门化”,而是纯粹的破坏。没有什么能阻止你继承私人财产。您可以一般地转发
运算符
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')
myDataStream &operator<<(myDataStream &stream, data &d )
    {
        stream<<d.getData();
        return stream;
    }