在 C++ 命名空间中 myspace
我有一个类Outer
它又有一个内部类 Inner
.虽然我可以声明和定义全局友元运算符 QDataStream& operator<<(QDataStream& s, const myspace::Outer& o)
,我看不到如何声明全局友元运算符 QDataStream& operator<<(QDataStream& s, const myspace::Outer::Inner& o)
.注释掉的行表示失败的尝试。我看不出如何在不定义外部类的情况下声明内部类。
namespace myspace {
class Outer;
//class Outer::Inner;
}
QDataStream& operator<<(QDataStream& s, const myspace::Outer& o);
//QDataStream& operator<<(QDataStream& s, const myspace::Outer::Inner& o);
namespace myspace {
class Outer {
friend QDataStream& (::operator <<)(QDataStream&, const Outer&);
class Inner {
//friend QDataStream& (::operator <<)(QDataStream&, const Inner&);
int i;
};
int o;
};
}
我读过 Namespaces and operator resolution , C++ Defining the << operator of an inner class , Accessing private class in operator<< in namespace 和 Operator overloading, name resolution and namespaces , 但似乎都不起作用。
如果我取消注释这些行,第一行会给出错误消息“outer.h:7: error: 'Inner' in 'class myspace::Outer' does not name a type 类外层::内层; ^" 这似乎是关键。我不能声明内部类。
我正在使用 C++ 11。
这个问题不是 Forward declaration of nested types/classes in C++ 的重复问题如果没有前向引用也能解决。
最佳答案
鉴于时间流逝,我发布了 Andreas H 给出的正确答案。
namespace myspace {
class Outer {
class Inner {
friend QDataStream& operator<<(QDataStream&, const Inner&);
int i;
};
friend QDataStream& operator<<(QDataStream&, const Outer&);
friend QDataStream& operator<<(QDataStream&, const Inner&);
int o;
};
QDataStream& operator<<(QDataStream& s, const myspace::Outer& o) {
s << o.o;
return s;
}
QDataStream& operator<<(QDataStream& s, const myspace::Outer::Inner& i) {
s << i.i;
return s;
}
}
关于C++ 命名空间、内部类和运算符解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45335075/