0

我创建了一个类(MyNodeClass),现在想要添加序列化功能。我声明(在 mynodeclass.h 中)我的序列化方法如下:

#ifndef MYNODECLASS_H
#define MYNODECLASS_H

#include <QString>
#include <QVariant>
#include <QDataStream>
#include <QReadWriteLock>


namespace NS { class MyNodeClass; }
QDataStream& operator<<(QDataStream &out, const MyNodeClass &node);
QDataStream& operator>>(QDataStream &in, MyNodeClass &node);


namespace NS {

class MyNodeClass
{
public:
    MyNodeClass(quint64 parent, QString name, MyNodeClass::MyEnum type);
    friend QDataStream& operator<<(QDataStream &out, const MyNodeClass &node);
    friend QDataStream& operator>>(QDataStream &in, MyNodeClass &node);

private:
    quint64 m_parent;
    QString m_name;
    int m_type;
    QVariant m_content;
    QReadWriteLock m_lock;
};
}

#endif // MYNODECLASS_H

我的定义(在 mynodeclass.cpp 中)是:

 #include "mynodeclass.h"


QDataStream& operator<<(QDataStream &out, const NS::MyNodeClass &node) {
    out
            << node.m_name
            << node.m_type
            << node.m_parent
            << node.m_content;
    return out;
}


QDataStream& operator>>(QDataStream &in, NS::MyNodeClass &node) {
    QString name;
    int type;
    quint64 parent;
    QVariant contents;

    in
            >> name
            >> type
            >> parent
            >> contents;
    node = NS::MyNodeClass(parent,name,type);

    return in;
}

using namespace NS;

MyNodeClass::MyNodeClass(quint64 parent, QString name, MyNodeClass::MyEnum type) {}

编译器抱怨我的 operator<< 无法访问 NS::MyNodeClass 的私有成员。这意味着签名没有排队。我已经尝试了命名空间相关更改的所有组合,但无法弄清楚。我在这篇文章之后建模了我的代码

应该如何定义友元函数,以便不会抱怨命名空间或访问私有成员?(请注意,我能找到的所有示例都使用单个文件,因此拆分为 .h 和 .cpp 是需要解决的问题的一部分)

4

1 回答 1

0

您在不同的命名空间中声明 2 operator >>,只有namespace NSis中的一个friend

摆脱你的“前向声明”:

// Remove that
namespace NS { class MyNodeClass; }
QDataStream& operator<<(QDataStream &out, const MyNodeClass &node);
QDataStream& operator>>(QDataStream &in, MyNodeClass &node);

并实施NS::operator<<

namespace NS {

QDataStream& operator<<(QDataStream &out, const NS::MyNodeClass &node) {
    return out << node.m_name
               << node.m_type
               << node.m_parent
               << node.m_content;
}

QDataStream& operator>>(QDataStream &in, NS::MyNodeClass &node) {
    QString name;
    int type;
    quint64 parent;
    QVariant contents;

    in >> name
       >> type
       >> parent
       >> contents;
    node = NS::MyNodeClass(parent, name, type);

    return in;
}


MyNodeClass::MyNodeClass(quint64 parent, QString name, MyNodeClass::MyEnum type) {}
于 2021-01-31T09:24:04.113 回答