0

我有一个名为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);
}
4

2 回答 2

1

好吧,错误的原因no match for 'operator>>'是 没有任何匹配项operator>>,至少在您显示的代码中没有。 您显示的代码中唯一的operator>>and是 for和 for 。什么都不是 a ,也不是 a ,也不是 a ,也不是a 。 operator<<Packet::CommonHeaderPacketquint32QTimePacketTypeint

就此而言,您向我们展示的实现是 for Packet::CommonHeaderPacket; 但是,这些类在命名空间中DG,而不是在全局命名空间中。

这也可以解释为什么friend不起作用的原因。您声明为朋友的运算符在 namespace 中DG,您定义的运算符在全局命名空间中(因此是完全不相关的函数)。

于 2011-04-18T08:13:59.407 回答
0

在修改 >> 运算符时,首先从 rhs 参数中删除 const。

于 2011-04-18T06:16:13.840 回答