nehme ich eine Vorlage T
definieren, die eine verschachtelte Klasse der Template-Parameter P
wie folgt verwendet:Mit verschachtelten Klasse von Template-Parameter in CRTP
template<class P> class T
{
public:
T(P& p) : p(p) {}
P& p;
typename P::Nested& get_nested() { return p.nested; }
};
Wenn ich eine Klasse deklarieren A
mit dem Namen eine verschachtelte Klasse umfasst
class A
{
public:
class Nested
{
public:
int i;
};
Nested nested;
};
void test2a()
{
A a;
a.nested.i = 1;
T<A> t_a(a);
t_a.get_nested().i = 2;
}
Nun, ich habe eine Klasse B
erklären will, die in der gleichen Art und Weise, eine verschachtelte cla beinhaltet: Nested
, kann ich eine Variable vom Typ T<A>
ohne Probleme definieren ss namens Nested
und erbt von T<B>
wie folgt:
class B : public T<B>
{
public:
class Nested
{
public:
int i;
};
Nested nested;
};
Compilation des obigen Codes wird mit Fehler: „Nested kein Mitglied von B ist“
Ich glaube, ich verstehe, was passiert: Zum Zeitpunkt der Eingabe der Vorlage ist die Klasse B wegen Vererbung unvollständig definiert.
aber ich frage mich, ob es eine Möglichkeit, so etwas zu tun ist ...
Vielen Dank für Hilfe.
Vielen Dank für diese Tricks, Petr und Ecatmur. Allerdings verwende ich MSVC 2010 Compiler, die keine von ihnen kompilieren werden. Ich denke ernsthaft darüber nach, auf einen C++ 14-kompatiblen Compiler zu aktualisieren ... jetzt. Wie auch immer, vielen Dank für deine Antworten. – shrike
@SharpDressedMan, was ist das genaue Problem und exakte Fehlermeldung mit meiner zweiten Lösung? Es scheint sogar C++ 03 für mich zu sein ... – Petr
Fehler ist C4519: Standardschablonenargumente sind nur für eine Klassenvorlage zulässig. – shrike