2010-11-05 703 views
6
class Example { 

    // ... 
}; 

template <typename T, Example ex> //Error 
class MyExample{ 

    // ... 
}; 

Mi pregunta es por qué los parámetros no-tipo de plantilla pueden ser de tipo de clase?¿Por qué no pueden los parámetros de tipo de plantilla no ser del tipo de clase

El error que consigo es

error: ‘class Example’ is not a valid type for a template constant parameter

+2

Aclare, ¿qué tipo de error de compilación está viendo? – seand

+0

Pruebe (Ejemplo * ex). Funciona:] – k06a

+0

Tal vez (Example & ex) funciona. Sólo inténtalo . . . – k06a

Respuesta

13

Simplemente, porque esas son las reglas. Racionalmente, los parámetros de plantilla deben resolverse en tiempo de compilación y los objetos de tipo de clase solo se construyen (incluso los temporales y aquellos con duración de almacenamiento estático) en tiempo de ejecución. Solo puede tener parámetros de plantilla que sean "valores" que puedan resolverse en tiempo de compilación, como enteros y tipos. Sin embargo, es posible tener parámetros de plantilla que sean punteros o referencias a objetos.

3

Según c++ standard,

A non-type template-parameter shall have one of the following (optionally cv-qualified) types: 
— integral or enumeration type, 
— pointer to object or pointer to function, 
— reference to object or reference to function, 
— pointer to member. 

A non-type template-parameter shall not be declared to have floating point, **class**, or void type. 

Es obvio que cualquier std conforme compilador genera un error si se declara la clase como un argumento de plantilla no tipo.

Cuestiones relacionadas