【发布时间】:2017-01-06 18:29:36
【问题描述】:
考虑这段代码:
#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
哪个是正确的行为,为什么?
【问题讨论】:
-
我不知道这个问题的答案,但我知道 Microsoft Visual Studio 的 C++ 编译器通常不符合标准。 (所以我的猜测是微软VS是错误的)
-
VS 2015 应该非常接近标准。经过快速检查后,Clang 似乎表现得像 GCC。所以在不知道细节的情况下,我也会假设 VS 是错误的。也许你在这里偶然发现了一个错误。
标签: c++ templates base-class name-lookup dependent-name