不能在没有命名空间冲突的情况下定义友元函数

问题描述

我创建了一个类 (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) {}