2011-04-18 108 views
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); 
} 
+2

操作符>>()的第二個參數是怎麼來的? – 2011-04-18 06:10:42

+0

哦!雅ya謝謝你...我只是複製運營商的貼紙<<並將其更改爲運營商>> – 2011-04-18 06:13:48

回答

1

那麼,對於no match for 'operator>>'錯誤的原因是 不存在任何匹配的operator>>,至少不會在 還有你的代碼。您所示代碼中唯一的operator>>operator<< 用於Packet::CommonHeaderPacket。對於quint32QTime, ,PacketType,也不對int都沒有任何影響。

對於這個問題,你給我們的實現是 Packet::CommonHeaderPacket;然而,這些類在命名空間DG中是 ,而不是在全局名稱空間中。

這也可以解釋爲什麼friend不起作用。 您聲明爲朋友的運算符在命名空間DG, 中,您定義的運算符位於全局命名空間中(因此與 完全無關的函數)。

+0

在cpp中執行'DG :: operator <<'解決了朋友問題。但是它的'DG :: operator <<'不是Global'operator <<'那麼它對於操作符重載是否有效? – 2011-04-18 17:19:28

+0

編譯器會在任何時候發現任何參數,以某種方式暗示'DG';例如如果'QDataStream'始終在'DG'中。否則,您可以創建':: operator >>'''friend',或者您可以提供一個公共成員函數'print'或其他任何東西,並從'operator <<'調用它,從而避免需要'friend' 。 – 2011-04-18 18:03:44

+0

但'QDataStream'不在'DG' – 2011-04-18 18:33:53

0

首先從的RHS參數刪除常量在>>運營商要修改它們。

+0

請檢查編輯 – 2011-04-18 16:50:58

相關問題