朋友没有得到私人会员

时间:2011-04-18 06:06:28

标签: c++ qt stream operator-overloading friend-function

我有一个名为Packet的课程我希望使用QDataStream序列化我重载了operator>>operator<<,并在我称为{{1}的重载函数中虽然它被宣称为朋友,它抱怨私人变量

stream << somIntMember

这是我的标题。

error: 'int DG::Packet::_state' is private
error: 'DG::Packet::PacketType DG::Packet::_type' is private

这里是Ciode

namespace DG{
class Packet{
    public:
    struct CommonHeader{
        public:
            quint32 id;
            QTime time;
            quint32 size;
            PacketType packetType;
        public:
            CommonHeader();
            CommonHeader(quint32 sz, PacketType type);
            friend QDataStream& operator<<(QDataStream&, const Packet::CommonHeader& header);
            friend QDataStream& operator>>(QDataStream&, Packet::CommonHeader& header);
    };
private:
    PacketType _type;
    int _state;
public:
    friend QDataStream& operator<<(QDataStream&, const Packet& packet);
    friend QDataStream& operator>>(QDataStream&, Packet& packet);
};
}

2 个答案:

答案 0 :(得分:1)

嗯,no match for 'operator>>'错误的原因是 operator>>没有任何匹配,至少没有。{ 您展示的代码。唯一的operator>>operator<< 您显示的代码中的代码是Packet::CommonHeaderPacketquint32QTime,也不是PacketType都没有 一个int,也不是Packet::CommonHeader

就此而言,您向我们展示的实施是为了 PacketDG;但是,这些课程是 在名称空间friend中,而不是在全局名称空间中。

这也可以解释DG无效的原因。 您声明为朋友的运算符位于命名空间{{1}}中, 您定义的那些是在全局命名空间中(因此 完全无关的功能)。

答案 1 :(得分:0)

首先从&gt;&gt;中的rhs参数中删除const。操作员在修改它们时。