2010-03-15 17 views
47

Ich spiele mit Vorlagen herum. Ich versuche nicht, den std :: vector neu zu erfinden, ich versuche, das Schablonieren in C++ zu verstehen.Struct mit Template-Variablen in C++

Kann ich Folgendes tun?

template <typename T> 
typedef struct{ 
    size_t x; 
    T *ary; 
}array; 

Was ich versuche ist eine grundlegende Templat zu tun Version:

typedef struct{ 
    size_t x; 
    int *ary; 
}iArray; 

Es sieht aus wie es funktioniert, wenn ich eine Klasse statt struct verwenden, so ist es nicht möglich, mit typedef structs ?

Antwort

106

Das Problem ist, Sie können keine Vorlage ein typedef, auch gibt es keine Notwendigkeit, typedef Strukturen in C++.

Im Folgenden wird das tun, was Sie als eine Klasse benötigen

template <typename T> 
struct array { 
    size_t x; 
    T *ary; 
}; 
+3

+1 für die Erklärung des Unterschieds zwischen Ihrem Code und @ monkeyking. – rcollyer

18
template <typename T> 
struct array { 
    size_t x; 
    T *ary; 
}; 
8

Sie brauchen keine explizite typedef für Klassen und Strukturen zu tun. Wozu brauchst du die typedef? Ferner ist die typedef nach einer template<...> syntaktisch falsch. Verwenden Sie einfach:

+0

Wohin ging der Name der Struktur? :) – GManNickG

+0

@GMan: Aktualisiert. – dirkgently

+0

Hm, wollten Sie das nach struct setzen? – GManNickG

5

Sie auch eine Struktur Vorlage kann. Sie können jedoch keine typedef-Vorlage erstellen. So funktioniert template<typename T> struct array {...}; funktioniert, aber template<typename T> typedef struct {...} array; nicht. Beachten Sie, dass der typedef-Trick in C++ nicht benötigt wird (Sie können Strukturen ohne den Modifikator struct in C++ verwenden).

4

Die Norm sagt (bei 14/3. Für die Nicht-Standard-Leute, die Namen nach einer Klassendefinition Körper (oder die Art in einer Erklärung im Allgemeinen) sind „Deklaratoren“)

In einem Template-Deklaration, explizite Spezialisierung oder explizite Instanziierung Die Init-Deklarator-Liste in der Deklaration darf höchstens einen Deklarator enthalten. Wenn eine solche Deklaration zum Deklarieren einer Klassenvorlage verwendet wird, ist kein Deklarator zulässig.

Mach es wie Andrey zeigt.

3

Die Syntax ist falsch. Die typedef sollte entfernt werden.

3

Aus den anderen Antworten besteht das Problem darin, dass Sie einen Typedef templatieren. Der einzige "Weg" ist eine Template-Klasse zu verwenden. dh grundlegende Template-Metaprogrammierung.

template<class T> class vector_Typedefs { 
    /*typedef*/ struct array { //The typedef isn't necessary 
     size_t x; 
     T *ary; 
    }; 

    //Any other templated typedefs you need. Think of the templated class like something 
    // between a function and namespace. 
} 

//An advantage is: 
template<> class vector_Typedefs<bool> 
{ 
    struct array { 
     //Special behavior for the binary array 
    } 
}