Рассмотрим этот код:
#include <iostream>
namespace N {
class A {};
void f(A a) { std::cout << "N::f\n"; }
}
void f(int i) { std::cout << "::f\n"; }
template <typename T>
class Base {
public:
void f(T x) { std::cout << "Base::f\n"; }
};
template <typename T>
class X : public Base<T> {
public:
void g() {
T t;
f(t);
}
};
int main()
{
X<N::A> x1;
x1.g();
X<int> x2;
x2.g();
}
Код предназначен для исследования того, как работает поиск имени на С++.
Если я скомпилирую эту программу с помощью GNU С++ (версия 6.1.0), она печатает:
N::f
::f
Но если я скомпилирую его с Microsoft Visual Studio 2015, он печатает:
Base::f
Base::f
Какое правильное поведение и почему?