我创建了一个类(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 是需要解决的问题的一部分)