2017-07-26 71 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; 
} 
}