C++命名空间,内部类和运算符分辨率
问题描述:
在C++命名空间myspace
中,我有一个类Outer
,该类又有一个内部类Inner
。尽管我可以声明并定义全球朋友运营商QDataStream& operator<<(QDataStream& s, const myspace::Outer& o)
,但我无法看到如何声明全球朋友运营商QDataStream& operator<<(QDataStream& s, const myspace::Outer::Inner& o)
。注释掉的行表示尝试失败。我没有看到如何在没有定义外层的情况下声明内层类。C++命名空间,内部类和运算符分辨率
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:错误:‘内’在‘类的MySpace ::外’没有指定 型类外::内; ^ “ 这似乎是关键。我不能声明内部类。
我使用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;
}
}
你可以添加错误消息,当您尝试与失败的尝试编译你? – HatsuPointerKun
当第一个注释行取消注释时,我添加了错误消息。 – fundagain
你是对的,这是重复的。看来在C++中是不可能的。 – fundagain