C++命名空间、内部类和运算符解析

C++ namespaces, inner classes and operator resolution

本文关键字:运算符 内部类 命名空间 C++      更新时间:2023-10-16

在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;
};
}

我读过 命名空间和运算符解析,C++定义内部类的<<运算符,在运算符中访问私有类<<在命名空间中 和运算符重载、名称解析和命名空间,但似乎都不起作用。

如果我取消注释这些行,第一个给出错误消息"outer.h:7:error:"class myspace::Outer"中的'Inner'没有命名类型 类外::内; ^" 这似乎是关键。我不能声明内部类。

我正在使用C++ 11。

这个问题不是嵌套类型/类的前向声明的副本,如果可以在没有前向引用的情况下解决C++。

鉴于时间流逝,我发布了安德烈亚斯·

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;
}
}