2017-07-26 45 views
3

在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 resolutionC++ Defining the << operator of an inner classAccessing private class in operator<< in namespaceOperator overloading, name resolution and namespaces,但没有一个似乎工作。

如果我去掉这些行中,第一提供错误消息“outer.h:7:错误:‘内’在‘类的MySpace ::外’没有指定 型类外::内; ^ “ 这似乎是关键。我不能声明内部类。

我使用C++ 11

这个问题不是Forward declaration of nested types/classes in C++重复的,如果它可以在不参考向前来解决。

+0

你可以添加错误消息,当您尝试与失败的尝试编译你? – HatsuPointerKun

+0

当第一个注释行取消注释时,我添加了错误消息。 – fundagain

+0

你是对的,这是重复的。看来在C++中是不可能的。 – fundagain

回答

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