¿Cómo se debe comportar este código? Llama a la función genérica ignorando mi sobrecarga si uso nombre calificado en la función call_read()
; y llama a la sobrecarga primero y luego a la versión genérica si uso nombre no calificado. ¿Cual es la diferencia? ¿Es un error en GCC?Comportamiento diferente para la búsqueda de nombre calificado y no calificado para la plantilla
#include <iostream>
struct info1 {};
struct info2 {};
template<class T> void read(T& x)
{
std::cout << "generic" << std::endl;
}
template<class T> void call_read(T& x)
{
::read(x); // if I replace ::read(x) with read(x) the overload is called
}
void read(info1& x)
{
std::cout << "overload" << std::endl;
}
int main()
{
info1 x;
info2 y;
call_read(x);
call_read(y);
}
También me di cuenta de que funciona diferente para los tipos fundamentales. Ver el código abajo
#include <iostream>
typedef struct info1 {};
typedef struct info2 {};
typedef int info3;
typedef double info4;
template<class T> void read(T x)
{
std::cout << "generic" << std::endl;
}
template<class T> void call_read(T x)
{
read(x);
}
void read(info1 x)
{
std::cout << "overload" << std::endl;
}
void read(info3 x)
{
std::cout << "overload" << std::endl;
}
int main()
{
call_read(info1());
call_read(info2());
call_read(info3());
call_read(info4());
}
Se supone que llamar a la función sobrecargada dos veces, pero no lo es. Ver el resultado aquí http://codepad.org/iFOOFD52
¡Parece extraño! Otra pregunta: ¿cómo se llama a 'leer (información y)', si no está visible para 'call_read (T &)'? – iammilind
¿Por qué lo llamas usando ::? – Griwes
No lo soy, solo para fines de prueba. Veo que se comporta de manera diferente en función de cómo se llama. Eso es interesante. – axe