Wie haben eine Struktur mit der Vorlage mit einer Klasse
Mit diesem code (nur eine Klasse von test):
typedef unsigned short UInt16;
template<class T>
class CClass
{
public:
SValue* getNewSValue(void);
private:
typedef struct {
T *mValue;
T *next;
T *previous;
UInt16 index;
} SValue;
};
template<typename T>
SValue* CClass<T>::getNewSValue(void)
{
return new SValue;
}
Habe ich die folgenden Fehler:
Fehler B. c2143: Syntaxfehler : fehlendes
';' vor '*'error C4430: fehlender type-specifier -
int angenommen. Hinweis: C++ nicht
Unterstützung von default-int
Ist es möglich, eine Struktur in einer Klasse? Wenn ich erkläre das struct aus der Klasse der Vorlage nicht sieht, dass die Vorlage T
.
- +1: gut formatierte Frage
Du musst angemeldet sein, um einen Kommentar abzugeben.
$9.2/2 - Der Schlüssel ist die unten Zitat aus der C++ Standard03
`Eine Klasse ist als eine komplett-definiert den Objekt-Typ (3.9) (oder die komplette Art) beim schließen } die class-specifier. Innerhalb der Schüler-Spezifikation, die Klasse wird als abgeschlossen betrachtet, innerhalb der Funktion Körper, default-Argumente und-Konstruktor ctor-Initialisierungen (wie unter anderem in geschachtelten Klassen). Sonst gilt es als unvollständig-innerhalb der eigenen Klasse Mitglied-Spezifikation.
Weiß nicht, was ist
UINT16
, aber das folgende sollte funktionierenEDIT 3: Die
***
kam es zu versuchen, um die änderung FETT (das hätte ich sowieso gelöscht)typename
klappenmechanismus in der definition vongetNewSValue
? Das ist, weil SValue ist Unbenannt und wir haben zu finden, um es mit dentypedef
Namen ?typename
es würde analysiert werden, wie die definition von einem Mitglied namensSValue
KlasseCClass<T>
, für die kein Typ angegeben war:tempate<class T> Class<T>::SValue;
. Die folgenden Token werden würde, junk-und abgelehnt durch den compiler als Fehler in der syntax. All dies ist, da der compiler standardmäßig annimmt, nicht-Typen, wenn es nicht lookup-ein name, der auf der parse-Zeit (ich.e er weiß nicht, wasT
noch, also kann es nicht lookupSValue
). Wenn Sietypename
,SValue
ist richtig, gilt als Typname für das MitgliedgetNewSValue
.Da die member-Funktion definition ist im globalen Bereich, die Sie benötigen, um sich zu qualifizieren, deren Rückgabetyp mit
CClass::
zu verweisen, um den Namen innerhalb der Klasse scope. Auch dietypename
- Schlüsselwort ist erforderlich, wenn auf typenames verschachtelten Vorlagen.Auch, die geschachtelte Struktur struct ist Unbenannt. Beachten Sie, dass in C++, Klassen und Strukturen die korrekten Namen, und ein typedef-name ist nicht der name einer Klasse. Sie werden viel besser dran, die Vermeidung der Typdefinition.
template< typename T >
Teil. Für weniger verbose syntax definieren Sie die Funktion in derclass {}
Umfang. Danntypename
und Qualifikation (auf Klasse-lokalen Typen) sind nicht erforderlich.Es sieht aus wie Ihre
struct
ist nicht definiert, wenn Sie deklarieren des Rückgabetyps vongetNewSValue
.Mit, dass Sie keinen Fehler:
Und Sie auch zu qualifizieren, die
SValue
zurück geben, denn es ist eingebettet inCClass
wenn Sie es verwenden, um zu definierengetNewSValue
.Erklären
SValue
vorgetNewSValue()
:Stellen Sie außerdem sicher, dass
UInt16
definiert ist.wie zu versuchen, diese ? er arbeitete auf VS2008
Den SValue-Typ ist innerhalb des CClass-namespace. Sie brauchen, um vollständig zu qualifizieren, die typename-außerhalb der Klasse.
Außerdem sollten Sie SValue der öffentlichkeit, wenn es zurückgegeben wird, von einer öffentlichen Methode.
Für die Aufzeichnung, keiner von diesen wird kompilieren (auf GCC 4.2 mindestens) sobald ein Anruf zu
getNewSValue()
genannt wird. Da es sich um eine öffentliche Methode gibt einen Zeiger auf einen privaten Typ, erhalten Sie eine compile-Fehlermeldung, die besagt, dassSValue is private
.Um für diese zu arbeiten, müssen Sie, um SValue öffentlichkeit, oder ändern Sie den Typ der return-Wert
getNewSValue()
etwas wievoid*
, da es scheint, dass Sie versuchen zu machen SValue ein undurchsichtiger Typ.