C ++名称空间,内部类和运算符解析

时间:2017-07-26 18:42:23

标签: c++ namespaces global operator-keyword

在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,但似乎都没有。

如果我取消注释这些行,则第一行给出错误消息&#34; outer.h:7:错误:&#39;内部&#39;在&#39;类myspace :: Outer&#39;没有命名类型      class Outer :: Inner;                   ^&#34; 这似乎是关键。我无法宣布内部阶级。

我正在使用C ++ 11。

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

1 个答案:

答案 0 :(得分: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;
}
}