g ++中的模板函数匹配

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)但我想知道为什么这是必要的,因为它是完全明确的,并且就我的(公认的过时)匹配规则的知识而言,这应该工作.

ice*_*ime 12

编译器从当前范围开始检查候选的所有范围.它找到f在直接范围内命名的函数,并停止搜索.您的模板版本永远不会被视为候选人.

有关完整说明,请参阅命名空间和接口原理.


Pra*_*rav 5

请参阅C++ 03部分

3.4.1不合格的名称查找

在3.4.1中列出的所有情况下,在每个相应类别中列出的顺序中搜索范围; 一旦找到名称的声明,名称查找就会结束.如果没有找到声明,该程序就是格式错误.

在您的代码示例中,编译器f在当前作用域中找到一个名称,从而结束非限定名称查找,但函数原型中存在不匹配,因此您会收到错误.

对其进行::限定使其工作,因为然后在全局命名空间中搜索名称并f调用具有正确原型的名称.

  • 另一种可能性,明确地将名称带入范围`using :: f; F(2);` (2认同)