问题描述
我创建了一个类 (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,MyNodeClass::MyEnum type) {}
编译器抱怨我的 operatorthis post
之后模拟了我的代码应该如何定义友元函数,以便不会抱怨命名空间或访问私有成员? (请注意,我能找到的所有示例都使用单个文件,因此拆分为 .h 和 .cpp 是需要解决的问题的一部分)
解决方法
您在不同的命名空间中声明了 2 个 operator >>
,只有 namespace NS
中的一个是 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) {}