En C++ 03, la deducción del parámetro de plantilla no ocurre en algunos contextos. Por ejemplo:¿Cómo afectan los alias de la plantilla la deducción del parámetro de la plantilla?
template <typename T> struct B {};
template <typename T>
struct A
{
typedef B<T> type;
};
template <typename T>
void f(typename A<T>::type);
int main()
{
B<int> b;
f(b); // ERROR: no match
}
Aquí, int
no se deduce para T
, debido a que un tipo anidado como A<T>::type
es un contexto no deducida.
si lo hubiera escrito la función como esta:
template <typename T> struct B {};
template <typename T>
void f(B<T>);
int main()
{
B<int> b;
f(b);
}
todo está bien porque es B<T>
un contexto deducido.
En C++ 11, sin embargo, los alias de plantilla se pueden utilizar para ocultar un tipo anidado en una sintaxis similar al segundo ejemplo. Por ejemplo:
template <typename T> struct B {};
template <typename T>
struct A
{
typedef B<T> type;
};
template <typename T>
using C = typename A<T>::type;
template <typename T>
void f(C<T>);
int main()
{
B<int> b;
f(b);
}
¿Funcionaría la deducción del argumento de la plantilla en este caso? En otras palabras, ¿los alias de plantilla son un contexto deducido o un contexto no deducido? ¿O heredan el estado deducido/no deducido de lo que sea que alias?
Los alias son solo alias. Es como escribir 'template void f (typename A :: type);', que no es deducible. –
posible duplicado de [C++, el argumento de la plantilla no se puede deducir] (http://stackoverflow.com/questions/6060824/c-template-argument-can-not-be-deduced) – Nawaz
Creo que Kerrek SB es correcto sobre esto. Si hubiera proporcionado una cita, no necesitaría salir y buscar uno ;-) –