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

3
在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 resolutionC++ Defining the << operator of an inner classAccessing private class in operator<< in namespaceOperator overloading, name resolution and namespaces,但似乎都无法解决我的问题。

如果我取消注释这些行,第一行会给出错误信息“outer.h:7: error: 'Inner' in 'class myspace::Outer' does not name a type class Outer::Inner; ^",这似乎是关键。我无法声明内部类。

我正在使用C++ 11。

如果可以在没有前向引用的情况下解决问题,则此问题不是Forward declaration of nested types/classes in C++的重复问题。


当第一个被注释的行取消注释时,我添加了错误消息。 - fundagain
你是正确的,这是一个重复的问题。看起来在C++中是不可能的。 - fundagain
这里有一个简单的解决方案,但由于重复标记,我无法添加:namespace myspace { class Outer { friend QDataStream& operator<<(QDataStream&, const Outer&); public: class Inner { friend QDataStream& operator<<(QDataStream&, const Inner&); int i; }; private: 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; } } - Andreas H.
你不必将内部类公开。你也可以将 operator<<(QDataStream& s, const myspace::Outer::Inner& i) 声明为 Outer 和 Inner 类的友元函数。这样,操作符定义就可以在不将 Inner 类型公开的情况下工作。 - Andreas H.
重新开启 @AndreasH。 - Michael Myers
显示剩余5条评论
1个回答

0
鉴于时间已过,我将发布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;
}
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接