друг не получает закрытых членов

#c #qt #stream #operator-overloading #friend-function

#c #qt #поток #оператор-перегрузка #друг-функция

Вопрос:

У меня есть класс с именем, Packet который я хочу сериализовать с помощью QDataStream , который я перегрузил operator>> и operator<< и в перегруженной функции, которую я вызвал, stream << somIntMember хотя она объявлена как friend, она жалуется на закрытые переменные

 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 QDataStreamamp; operator<<(QDataStreamamp;, const Packet::CommonHeaderamp; header);
            friend QDataStreamamp; operator>>(QDataStreamamp;, Packet::CommonHeaderamp; header);
    };
private:
    PacketType _type;
    int _state;
public:
    friend QDataStreamamp; operator<<(QDataStreamamp;, const Packetamp; packet);
    friend QDataStreamamp; operator>>(QDataStreamamp;, Packetamp; packet);
};
}
  

И здесь начинается Code

 #include "packet.h"
using namespace DG;
QDataStreamamp; operator<<(QDataStreamamp; stream, const Packetamp; packet){
    stream << packet._state << packet._type;
    return packet.serialize(stream);
}
  

Комментарии:

1. Почему вторые параметры для operator>>() являются const?

2. О! Я, я, спасибо ТЕБЕ… Я просто копирую paster operator<< и меняю его на operator>>

Ответ №1:

Ну, причина no match for 'operator>>' ошибки в том, что для operator>> нет никакого соответствия, по крайней мере, не в коде, который вы показали. Единственные operator>> и operator<< в показанном вами коде — это для Packet::CommonHeader и для Packet . Ничего для a quint32 , ни для a QTime , ни для a PacketType , ни для an int .

Если уж на то пошло, реализации, которые вы нам показали, предназначены для Packet::CommonHeader и Packet ; классы, однако, находятся в пространстве имен DG , а не в глобальном пространстве имен.

Это также может объяснить причину, по которой friend не работает. Операторы, которые вы объявили как friend, находятся в пространстве имен DG , те, которые вы определяете, находятся в глобальном пространстве имен (и, таким образом, являются совершенно не связанными функциями).

Комментарии:

1. Выполнение DG::operator<< в cpp решило проблему с другом. Но это DG::operator<< не глобальное operator<< , так что сработает ли это при перегрузке оператора?

2. Компилятор найдет это в любое время, когда какой-либо из аргументов каким-либо образом подразумевает DG ; например, если QDataStream находится в DG , всегда. В противном случае вы можете создать ::operator>> и т.д. friend , или вы можете предоставить общедоступную функцию-член print или что-то еще и вызвать это из operator<< , таким образом избегая необходимости friend .

3. Но QDataStream не в DG

4. В этом случае вам, вероятно, не нужны operator<< и др. в DG либо, и следует создать ::operator<< и ::operator>> friend (или предоставить общедоступные print и scan функции, которые они вызывают).

Ответ №2:

Сначала удалите const из параметров rhs в >> operators при их изменении.