2010-03-15 20 views
47

Juego con plantillas. No estoy tratando de reinventar el std :: vector, estoy tratando de obtener una comprensión de la plantilla en C++.Estructura con variables de plantilla en C++

¿Puedo hacer lo siguiente?

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

Lo que estoy tratando de hacer es una versión básica con plantilla de:

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

Parece que está funcionando si uso una clase en lugar de estructura, por lo que no es posible con las estructuras typedef ?

Respuesta

106

El problema es que no puede la plantilla un typedef, tampoco hay necesidad de typedef struct en C++.

A continuación se hará lo que usted necesita

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

+1 para explicar la diferencia entre tu código y @ monkeyking's. – rcollyer

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

que no es necesario hacer una explícita typedef para las clases y estructuras. ¿Para qué necesita el typedef? Además, el typedef después de un template<...> es sintácticamente incorrecto. Sólo tiene que utilizar:

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

¿Dónde ha estado el nombre de la estructura? :) – GManNickG

+0

@GMan: actualizado. – dirkgently

+0

Hm, ¿quisiste poner eso después de struct? – GManNickG

5

Puede la plantilla una estructura, así como una clase. Sin embargo, no se puede crear una plantilla de tipodef. Así que template<typename T> struct array {...}; funciona, pero template<typename T> typedef struct {...} array; no. Tenga en cuenta que no hay necesidad del truco typedef en C++ (puede usar structs sin el modificador struct en C++). dice

4

El Estándar (al 14/3. Para la gente no estándar, los nombres siguientes un cuerpo definición de clase (o el tipo en una declaración en general) son "") declaradores

En una plantilla-declaración, especialización explícita o instanciación explícita la lista-declarador-init en la declaración contendrá como máximo un declarante. Cuando tal declaración se usa para declarar una plantilla de clase, no se permite declarante.

Hazlo como muestra Andrey.

3

La sintaxis es incorrecta. El typedef debe eliminarse.

3

De las otras respuestas, el problema es que estás creando un typedef. La única "manera" de hacer esto es usar una clase con plantilla; es decir, metaprogramación de plantillas básicas.

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