Различное поведение для поиска квалифицированного и неквалифицированного имени для шаблона

Как должен вести себя этот код? Это вызывает универсальную функцию, игнорирующую мою перегрузку, если я используюквалифицированный имя вcall_read() функция; и это вызывает перегрузку, а затем общую версию, если я используюнеквалифицированный имя. Какая разница? Это ошибка в GCC?

#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);
}

Я также заметил, что он работает по-разному для основных типов. Смотрите код ниже

#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());
}

Предполагается вызвать перегруженную функцию дважды, но это не так. Смотрите результат здесьhttp://codepad.org/iFOOFD52

Ответы на вопрос(3)

Ваш ответ на вопрос