0

私はオーバーロードされた関数でシリアル化したいというクラスを持っていて、Packetオーバーロードされた関数で呼び出しましたが、それは友人として宣言されていますが、プライベート変数について不平を言っていますQDataStreamoperator>>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>>そしてのためのものはのためのものです 。、、、、、、または。 _ _operator<<Packet::CommonHeaderPacketquint32QTimePacketTypeint

さらに言えば、あなたが私たちに示した実装はとのためのもの Packet::CommonHeaderですPacket。ただし、クラスは名前空間DGにあり、グローバル名前空間にはありません。

それはまた、なぜ機能しfriendていないのかを説明することができます。フレンドとして宣言した演算子は名前空間DGにあり、定義した演算子はグローバル名前空間にあります(したがって、完全に無関係な関数です)。

于 2011-04-18T08:13:59.407 に答える
0

>>演算子を変更するときは、最初に>>演算子のrhsパラメータからconstを削除します。

于 2011-04-18T06:16:13.840 に答える