2017-07-26 3 views
3

Dans l'espace de noms C++ myspace, j'ai une classe Outer qui à son tour a une classe interne Inner. Bien que je puisse déclarer et définir un opérateur ami global QDataStream& operator<<(QDataStream& s, const myspace::Outer& o), je ne vois pas comment déclarer un opérateur ami global QDataStream& operator<<(QDataStream& s, const myspace::Outer::Inner& o). Les lignes commentées représentent une tentative ratée. Je ne vois pas comment déclarer la classe interne sans définir l'extérieur.Espaces de noms C++, classes internes et résolution de l'opérateur

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

} 

J'ai lu Namespaces and operator resolution, C++ Defining the << operator of an inner class, Accessing private class in operator<< in namespace et Operator overloading, name resolution and namespaces, mais aucun ne semble fonctionner.

Si je décommentez ces lignes, le premier donne le message d'erreur « outer.h: 7: Erreur: 'intérieur' dans 'myspace class :: extérieur' ne nomme pas une classe de type extérieur :: intérieur; ^ " Cela semble être la clé. Je ne peux pas déclarer la classe interne.

J'utilise 11. C++

Cette question n'est pas un double de Forward declaration of nested types/classes in C++ si elle peut peut être résolu sans référence avant.

+0

Pouvez-vous ajouter des messages d'erreur que vous obtenez lorsque vous essayez de compiler les tentatives infructueuses? – HatsuPointerKun

+0

J'ai ajouté le message d'erreur lorsque la première ligne commentée est décommentée. – fundagain

+0

Vous avez raison, ceci est un doublon. Il semble que c'est impossible en C++. – fundagain

Répondre

0

Compte tenu du laps de temps, je signale la bonne réponse donnée par 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; 
} 
}