Dov*_*Dov 4 c++ templates g++ matching
我有一个奇怪的问题,我想知道为什么g ++ 4.1.2的行为方式.
剥夺其基本要素:
#include <iostream>
template<typename T>
inline void f(T x) { std::cout << x*x; }
namespace foo {
class A {
public:
void f() const { f(2); }
};
}
Run Code Online (Sandbox Code Playgroud)
调用f(2)失败,因为编译器无法匹配模板函数f.我可以使用它,::f(2)但我想知道为什么这是必要的,因为它是完全明确的,并且就我的(公认的过时)匹配规则的知识而言,这应该工作.
请参阅C++ 03部分
3.4.1不合格的名称查找
在3.4.1中列出的所有情况下,在每个相应类别中列出的顺序中搜索范围; 一旦找到名称的声明,名称查找就会结束.如果没有找到声明,该程序就是格式错误.
在您的代码示例中,编译器f在当前作用域中找到一个名称,从而结束非限定名称查找,但函数原型中存在不匹配,因此您会收到错误.
对其进行::限定使其工作,因为然后在全局命名空间中搜索名称并f调用具有正确原型的名称.