2010-03-15 26 views
47

Sto giocando con i modelli. Non sto cercando di reinventare lo std :: vector, sto cercando di capire il templateting in C++.Struct con variabili di modello in C++

Posso fare quanto segue?

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

Quello che sto cercando di fare è una versione di base su modelli di:

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

Sembra che funzioni se uso una classe al posto di struct, quindi non è forse possibile con le strutture typedef ?

risposta

106

Il problema è che non puoi template un typedef, inoltre v'è alcun bisogno di typedef struct in C++.

Di seguito vi do quello che ti serve

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

+1 per spiegare la differenza tra il tuo codice e @ monkeyking's. – rcollyer

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

non hai bisogno di fare un esplicito typedef per le classi e le strutture. Di cosa hai bisogno per il typedef? Inoltre, lo typedef dopo un template<...> è sintatticamente sbagliato. È sufficiente utilizzare:

template <class T> 
struct array { 
    size_t x; 
    T *ary; 
} ; 
+0

Dove è finito il nome della struttura? :) – GManNickG

+0

@GMan: aggiornato. – dirkgently

+0

Hm, intendevi metterlo dopo il struct? – GManNickG

5

È possibile template una struttura così come una classe. Tuttavia non è possibile creare un modello typedef. Quindi, template<typename T> struct array {...}; funziona, ma non lo è lo template<typename T> typedef struct {...} array;. Nota che non è necessario il trucco typedef in C++ (puoi usare struct senza il modificatore struct bene in C++). dice

4

The Standard (a 14/3. Per la gente non-standard, i nomi seguenti un corpo definizione di classe (o tipo in una dichiarazione in generale) sono "dichiaratori")

In un dichiarazione modello, specializzazione esplicita o istanziazione esplicita l'elenco iniziatore-dichiaratore nella dichiarazione deve contenere al massimo un dichiaratore. Quando tale dichiarazione viene utilizzata per dichiarare un modello di classe, non è consentito alcun dichiarante.

Fai come mostra Andrey.

3

La sintassi è errata. Il typedef deve essere rimosso.

3

Dalle altre risposte, il problema è che si sta tentando di creare un typedef. L'unico "modo" per farlo è usare una classe basata su modelli; cioè, metaprogrammazione del modello di base.

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 
    } 
}