2012-09-24 19 views
19

¿Qué hay de malo en el siguiente fragmento de código?Plantilla del candidato ignorada porque el argumento de la plantilla no se pudo inferir

#include <iostream> 

template<typename K> 
struct A { 
    struct X { K p; }; 
    struct Y { K q; }; 
}; 

template<typename K> 
void foo(const typename A<K>::X& x, const typename A<K>::Y& y) { 
    std::cout << "A" << std::endl; 
} 

int main() { 
    A<float>::X x; 
    A<float>::Y y; 
    foo(x, y); 
} 

sonido metálico da el siguiente mensaje de error:

17:2: error: no matching function for call to 'foo' 
     foo(x, y);  
     ^~~ 
10:6: note: candidate template ignored: couldn't infer template argument 'K' 
void foo(const typename A<K>::X& x, const typename A<K>::Y& y) { 
    ^
1 error generated. 

Respuesta

37

El argumento K en const typename A<K>::X es no deducible. Básicamente, todo lo que queda de un :: no es deducible (si :: separa un nombre anidado).

Es trivial para ver por qué no tiene sentido pedir la deducción mediante la ejecución a través de este experimento mental:

struct A { typedef int type; } 
struct B { typedef int type; } 

template <typename T> void foo(typename T::type); 

foo(5); // is T == A or T == B ?? 

No hay correlación de uno a uno de los tipos a los tipos anidados: Dado cualquier tipo (por ejemplo, como int), podría haber muchos tipos de ambiente de los cuales es un tipo anidado, o no tiene que haber ninguno.

6
template<typename K> 
void foo(const typename A<K>::X& x, const typename A<K>::Y& y) { 
    std::cout << "A" << std::endl; 
} 

K no se ha deducido, ya que está en non-deduced contexto.

n3337 14.8.2.5/4

En ciertos contextos, sin embargo, el valor no participa en el tipo de deducción, sino que utiliza los valores de argumentos de plantilla que fueron ya sea deducido en otro lugar o explícitamente especificados. Si un parámetro de plantilla se usa solo en contextos no deducidos y no se especifica explícitamente, la deducción del argumento de la plantilla falla.

n3337 14.8.2.5/5

Los contextos no deducido son:

- El anidado de nombre especificador de un tipo que se ha especificado el uso de un cualificado-id.

Cuestiones relacionadas