2012-04-05 10 views
1

Ich versuche, eine Klasse weiterzuleiten, die von einer Vorlagenklasse abgeleitet ist, die ebenfalls nach vorne deklariert sein muss. HierWie kann ich eine Klasse deklarieren, die von einer nach vorne deklarierten Template-Basisklasse abgeleitet ist?

ist ein Beispiel für die Klassen:

class TType { 
public: 
    TType() { } 
}; 

template<typename T> 
class Base { 
public: 
    Base() { } 
}; 

class Derived : public Base<TType> { 
public: 
    Derived() { } 
}; 

Hier ist eine gescheiterte Vermutung an, was ich brauche:

class TType; 
template<typename T> class Base; 
class Derived : public Base<TType>; // This fails 
Derived* pDerived; 

Antwort

5

einfach erklären sie darauf, den Klassennamen:

class Derived; 

Sie können keine weiteren Informationen zu einer Klasse in ihre Deklaration aufnehmen. Basisklassen, Mitglieder usw. können nur in der Klassendefinition deklariert werden.

Diese Forward-Deklaration kann verwendet werden, um verschiedene Dinge zu tun, einschließlich der Deklaration von Zeigern oder Referenzen (wie pDerived in Ihrem Beispiel), und auch Funktionen mit Derived als ein Argument oder Rückgabetyp deklarieren. Wenn Sie etwas tun müssen, das die Klassengröße, Basisklassen oder Mitglieder kennen muss, benötigen Sie die vollständige Definition.

+0

Sie haben natürlich recht, aber als ich das probiert habe und es gescheitert ist. Hier ist mein Fehler, in der Vorwärtsdeklaration habe ich 'namespace {class Derived}; und dann' class Derived; '. Anscheinend benutzt 'namespace' um etwas zu sagen, hat keinen Namespace ist nicht das gleiche wie nur' Namespace' zu ​​skaten, so dass der Compiler mir sagte, dass es mehrdeutig ist. – Solx

Verwandte Themen