我有一个名为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);
};
}
答案 0 :(得分:1)
嗯,no match for 'operator>>'
错误的原因是
operator>>
没有任何匹配,至少没有。{
您展示的代码。唯一的operator>>
和operator<<
您显示的代码中的代码是Packet::CommonHeader
和
Packet
。 quint32
,QTime
,也不是PacketType
都没有
一个int
,也不是Packet::CommonHeader
。
就此而言,您向我们展示的实施是为了
Packet
和DG
;但是,这些课程是
在名称空间friend
中,而不是在全局名称空间中。
这也可以解释DG
无效的原因。
您声明为朋友的运算符位于命名空间{{1}}中,
您定义的那些是在全局命名空间中(因此
完全无关的功能)。
答案 1 :(得分:0)
首先从&gt;&gt;中的rhs参数中删除const。操作员在修改它们时。