11

No veo por qué la instrucción en main es ambigua.Ambigüedad de especialización de plantilla parcial

template<class T, class U, int I> struct X 
{ void f() { cout << "Primary template" << endl; } }; 


template<class T, int I> struct X<T, T*, I> 
{void f() { cout << "Partial specialization 1" << endl;}}; 

template<class T, class U, int I> struct X<T*, U, I> 
{void f() { cout << "Partial specialization 2" << endl;}}; 

template<class T> struct X<int, T*, 10> 
{void f() { cout << "Partial specialization 3" << endl;}}; 

template<class T, class U, int I> struct X<T, U*, I> 
{void f() { cout << "Partial specialization 4" << endl;}}; 

int main() 
{ 
    X<int, int*, 10> f; 
} 

¿No es X<int, T*, 10> la plantilla más especializada? Este es un ejemplo de http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fpartial_specialization.htm

+1

La razón se da debajo del ejemplo: El compilador no permitió la declaración 'X ' f porque puede coincidir con la plantilla struct 'X ', template struct 'X ', o template struct 'X ', y ninguna de estas declaraciones es una mejor coincidencia que las demás. –

Respuesta

10

Una especialización de plantilla es más especializada que otra si cada lista de argumentos que coincide con la primera también coincide con la segunda, pero no al revés.

Al mirar X<int, T*, 10> y X<T, T*, I>:

  • X<int, float*, 10> coincide con el primero, pero no el segundo.
  • X<float, float*, 10> coincide con el segundo pero no el primero.

Por lo tanto, ninguno es más especializado que el otro y no se compilará una instancia de plantilla que coincida con ambas especializaciones.

+0

Mencione también el ordenamiento parcial de las especializaciones de plantilla de clase, que a su vez depende del ordenamiento parcial de las plantillas de función * sobrecargadas * compuestas a partir de los parámetros de plantilla de las especializaciones de plantilla de clase. – Nawaz

+1

@Nawaz: Sé que esa es la forma en que lo explican en el estándar, pero creo que creo que complicará las cosas con poco beneficio para explicarlo todo aquí (también tendría que explicar las reglas para ordenar plantillas de funciones de 14.5. 5.2, y la deducción del argumento de la plantilla de 14.8.2). Siéntase libre de agregar una respuesta si cree que esto necesita más detalles. – interjay

+0

Gracias, ahora lo entiendo. He leído la explicación al final, pero no pude entender por qué 'X ' no era la más especializada. – user1116459

Cuestiones relacionadas