2012-06-27 13 views
8

tengo este código:Parámetros de plantilla predeterminados: ¿por qué el compilador se queja de no especificar el argumento de la plantilla?

struct A{}; 

template<class T = A> 
struct B { 
    void foo() {} 
}; 

B b; //Error: missing template arguments before 'b' 
    //Error: expected ';' before 'b' 
    //More errors 
b.foo() 

Si hago foo() como una función de plantilla con la misma plantilla 'firma', el compilador no se queja de no especificar los argumentos de plantilla:

struct A {}; 

struct B { 
    template<class T = A> 
    void foo() {} 
}; 

B b; //OK 
b.foo() 

Entonces, ¿por qué debo especificar un argumento para una clase de plantilla con un parámetro predeterminado, pero no para una función de plantilla? ¿Me falta algo de sutileza?

El motivo se debe a la falla en la deducción del argumento de la plantilla. Pero quiero saber por qué.

+0

¿Falta una palabra en el título de esta pregunta? – Pointy

+0

Sí. Perdió la palabra, quejarse. Lo agregué. – badmaash

+0

Posible duplicado de * [Argumentos de plantilla predeterminados para plantillas de funciones] (http://stackoverflow.com/questions/2447458/default-template-arguments-for-function-templates) *. –

Respuesta

7

La sintaxis correcta es la siguiente (demo):

B<> b; 

El valor predeterminado argumento A se asume para la plantilla de clase B. La parte <> le dice al compilador que B es una plantilla de clase y le pide que tome el parámetro predeterminado como el argumento de la plantilla.

+0

Ya veo. Pero ¿por qué la función de plantilla funciona sin esto: 'b.foo <>()'? – badmaash

+1

@badmaash: Eso no funciona: http://ideone.com/QhWgJ – Nawaz

+0

Mi mal. Debería haber mencionado g ++ 4.7.0 que tiene soporte para parámetros de plantilla por defecto para funciones. Entonces el código de arriba definitivamente funciona. Intenta correr con g ++ 4.7.0. – badmaash

0

Porque hay que decir que es una plantilla B:

B<> b; 

Aun cuando no se desea especificar cualquiera de los argumentos.

+0

En realidad, necesitas '<>' para decirle al compilador que no quieres una plantilla, sino la instanciación de una plantilla con el argumento predeterminado. La sintaxis es correcta sin embargo. –

1

La sintaxis correcta, como se menciona ya está Nawaz:

B<> b; 

La razón es que es B la plantilla y B<> es la instanciación de la plantilla con el argumento predeterminado A. Pero necesita el <> para diferenciar cuando quiere una instanciación.

Cuestiones relacionadas