如何解决不能在没有命名空间冲突的情况下定义友元函数
我创建了一个类 (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) {}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。