2011-07-08 16 views
10

myTemplateTemplate espera que el segundo parámetro de plantilla sea una plantilla con un argumento. myDefaultTemplate es una plantilla con dos argumentos, y el segundo argumento tiene el tipo predeterminado int.Por qué la plantilla con argumentos de plantilla predeterminados no se puede usar como plantilla con menos argumento de plantilla en Plantilla Parámetros de plantilla

En VS2008, me sale el error de compilación: la lista de parámetros de plantilla para la plantilla de clase 'myDefaultTemplate' no coincide con la lista de parámetros de plantilla para el parámetro de plantilla

Así que, ¿por qué la myDefaultTemplate no se puede utilizar 'TT' como la plantilla con solo un argumento? ¿Hay algún impacto negativo si el compilador de C++ lo admite?

template 
<typename T1, typename T2 = int> 
class 
myDefaultTemplate{ 
     T1 a; 
     T2 b; 
}; 

template 
<typename T1, template<typename T2> class TT> 
class 
myTemplateTemplate{ 
     T1 a; 
     TT<T1> b; 
}; 

int main(int argc, char* argv[]){ 
     myTemplateTemplate<int, myDefaultTemplate> bar; //error here:  
     return 0; 
} 
+15

Debería obtener una insignia para "Pregunta que utiliza la palabra 'plantilla' la mayoría de las veces" :) – Praetorian

Respuesta

7

de la norma (ver 14.3.3 apartado 1 - [temp.arg.template):

A template-argument for a template template-parameter shall be the name of a class template, expressed as id-expression. Only primary class templates are considered when matching the template template argument with the corresponding parameter; partial specializations are not considered even if their parameter lists match that of the template template parameter.

Eso significa que la plantilla myDefaultTemplate se verá sólo como plantilla 2 argumentos. El argumento predeterminado no será considerado.

+0

Sí, esta es la respuesta que esperaba. Gracias – RolandXu

Cuestiones relacionadas