2011-06-11 17 views
6

I declarar una clase de plantilla con todos los parámetros que tienen argumentos por defecto, por ejemplo:typedef una plantilla con todos los argumentos predeterminados

template<typename TYPE = int> 
class Foo {}; 

Entonces los dos siguientes son equivalentes:

Foo<int> one; 
Foo<> two; 

Sin embargo, I' m no está permitido hacer:

Foo three; 

¿Es posible lograr eso con un typedef al mismo nombre pero sin los soportes, así:

typedef Foo<> Foo; 

Respuesta

1

Si se permite que la declaración typedef Foo<> Foo;, a partir de entonces el nombre Foo como plantilla no puede especificarse. Es decir, lo siguiente deja de ser válido.

template< template<class> class > struct A {...}; 
A<Foo> a; // error 

A pesar de lo anterior typedef no está permitido en la práctica, si todavía necesita escribir Foo como Foo<>, una macro como la siguiente se reunirá con el propósito.

#define Foo Foo<> 
+3

Puede ser demasiado tarde, pero no utilice definir para este propósito. Causará problemas de muchas maneras. NUNCA podrás usar foo con un tipo diferente. NUNCA podrás usar foo en otro espacio de nombres. –

2

No se puede redeclare un símbolo con un tipo diferente, así que lo que usted será capaz de hacer no va a funcionar como se espera. Si usted quiere lograr esto, utilizar un nombre diferente como alias:

typedef Foo<> Foo_; 
7

hago algo como lo siguiente, no sé si va a gustar o no:

template<typename TYPE = int> 
class basic_Foo {}; 

typedef basic_Foo<int> Foo; 
+4

"the stdlib approach". :) – Xeo

+1

Sí, lo mismo sucedió con 'basic_string' y amigos :) – rubenvb

+0

¿Entonces lo harías si' basic_Foo 'se usa mucho más que cualquier otro' basic_Foo '? La razón por la que pregunto es porque parece una cantidad excesiva de caracteres para agregar a un nombre de clase, a diferencia de: 'typedef Foo Foo_int' o algo así. –

0

Desafortunadamente , no, porque Foo ya es el nombre de la plantilla de clase en sí, y por lo tanto no puede ser otra cosa en el mismo espacio de nombres.

1
typedef Foo<> Foo; 

Da:

prog.cpp:4: error: ‘typedef class Foo<int> Foo’ redeclared as different kind of symbol 
prog.cpp:2: error: previous declaration of ‘template<class TYPE> class Foo’ 

El error de más o menos dice cuál es el problema. El compilador ve Foo como vuelto a declarar.

Sin embargo, esto compilará y trabajo:

template<typename TYPE = int> class Foo {}; 

typedef Foo<> FooClone; 

int main() 
{ 
    Foo<int> one; 
    Foo<> two; 
    FooClone three; 

    return 0; 
} 
1

No. A pesar de que se puede declarar una typedef para un class con el mismo nombre que un class porque se puede utilizar un typedef para redefinir un nombre para referirse a el tipo al que ya se refiere.

typedef class A A; 

o si A ya fue declarado como clase:

typedef A A; 

No se puede hacer eso con el nombre de una plantilla (el nombre de una plantilla no es un nombre de una clase), tendrías que darle un nombre diferente.

typedef Foo<> Bar; 
Cuestiones relacionadas