考虑这段代码:
#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();
}
该代码旨在研究名称查找在 C++ 中的工作方式。
如果我用 GNU C++(6.1.0 版)编译这个程序,它会打印:
N::f
::f
但如果我用 Microsoft Visual Studio 2015 编译它,它会打印:
Base::f
Base::f
哪个是正确的行为,为什么?