veces, a veces no funciona:¿Cuándo un compilador puede inferir un parámetro de plantilla?
template <class T>
void f(T t) {}
template <class T>
class MyClass {
public:
MyClass(T t) {}
};
void test() {
f<int>(5);
MyClass<int> mc(5);
f(5);
MyClass mc(5); // this doesn't work
}
¿Hay una manera de cortar alrededor del ejemplo anterior? Es decir. obligar al compilador a deducir el parámetro de plantilla del parámetro constructor.
¿Esto se solucionará en el futuro, o hay una buena razón para no hacerlo?
¿Cuál es la regla general cuando el compilador puede inferir un parámetro de plantilla?
+1, a fondo. Minor nit: sugiero cambiar "cuando el tipo de parámetro es dependiente" a "cuando un tipo de parámetro es dependiente". –
void f (nombre de tipo T :: const_iterator t); << aquí, T aparece en un contexto no deducible. incluso cuando lo llame con un vector :: const_iterator, por ejemplo, no podrá deducir el vector para T. la razón es que el significado de :: const_iterator depende de T. pero T depende de nuevo del significado de :: const_iterator. es por eso que boost :: implicit_cast está codificado así: plantilla T implicit_cast (typename identity :: type t) {return t; } aquí de nuevo, tenemos un contexto no deducible. –
Standard-ref es 14.8.2.4/4 (el último borrador de C++ 1x lo tiene ubicado en 14.9.2.5/5 - arreglando también algunas de las deficiencias de la redacción en el estándar actual). :) aplausos –