Cela peut être fait en avant de déclarer la classe externe comme un espace de nom .
Échantillon : Nous devons utiliser une classe imbriquée others::A::Nested dans others_a.h, ce qui est hors de notre contrôle.
autres_a.h
namespace others {
struct A {
struct Nested {
Nested(int i) :i(i) {}
int i{};
void print() const { std::cout << i << std::endl; }
};
};
}
ma_classe.h
#ifndef MY_CLASS_CPP
// A is actually a class
namespace others { namespace A { class Nested; } }
#endif
class MyClass {
public:
MyClass(int i);
~MyClass();
void print() const;
private:
std::unique_ptr<others::A::Nested> _aNested;
};
ma_classe.cpp
#include "others_a.h"
#define MY_CLASS_CPP // Must before include my_class.h
#include "my_class.h"
MyClass::MyClass(int i) :
_aNested(std::make_unique<others::A::Nested>(i)) {}
MyClass::~MyClass() {}
void MyClass::print() const {
_aNested->print();
}
6 votes
Pourquoi avez-vous besoin de cela ? Notez que vous pouvez déclarer en avant si c'est un membre de la même classe que celle qui est définie : class X { class Y ; Y *a ; } ; class X::Y { } ;
1 votes
Cette solution a fonctionné pour moi (namespace C { class D ; } ;): stackoverflow.com/questions/22389784/
0 votes
J'ai trouvé une solution enlace