朋友未获得私人成员

| 我有一个名为
Packet
的类,我想与
QDataStream
进行序列化,重载了
operator>>
operator<<
,在重载函数中我叫
stream << somIntMember
,尽管它被声明为朋友,但抱怨私有变量
error: \'int DG::Packet::_state\' is private
error: \'DG::Packet::PacketType DG::Packet::_type\' is private
我的标题到了。
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);
};
}
这就是Ciode
#include \"packet.h\"
using namespace DG;
QDataStream& operator<<(QDataStream& stream, const Packet& packet){
    stream << packet._state << packet._type;
    return packet.serialize(stream);
}
    
已邀请:
好吧,出现“ 8”错误的原因是
operator>>
没有任何匹配,至少在 您显示的代码。唯一的
operator>>
operator<<
您显示的代码中的
Packet::CommonHeader
Packet
。 for14ѭ,
QTime
,ѭ 16英镑,也不是17英镑。 因此,您向我们展示的实现仅用于
Packet::CommonHeader
Packet
;这些课程是 在名称空间“ 20”中,而不在全局名称空间中。 这也可以解释
friend
不起作用的原因。 您已声明为好友的运算符位于名称空间
DG
中, 您定义的那些位于全局名称空间中(因此 完全无关的功能)。     
修改它们时,首先从>>运算符的rhs参数中删除const。     

要回复问题请先登录注册