哪个查找规则阻止编译器查找函数

  • 本文关键字:查找 编译器 函数 规则 c++
  • 更新时间 :
  • 英文 :

void Foo(int i)
{
}
struct Bar
{
    static void Foo() { Foo(1); }
};

上面的代码无法编译。它找不到Foo(int).为什么?我知道这与具有相同的函数名称有关,但没有进一步了解问题。

为什么我需要合格的查找?

从 3.4.1 开始(强调我的(

在 3.4.1 中列出的所有情况下,将按照每个 各自的类别;一旦找到名称的声明,名称查找就会结束。如果没有声明 发现,程序格式不正确。

在这种特殊情况下,要搜索的第一个范围是函数本地范围。那里找不到Foo。然后是类范围。由于在其中找到了名称 Foo,因此名称查找到此停止,另一个 Foo 根本不参与重载解析。

如果特定命名空间中的函数与全局命名空间中的函数同名,则找不到全局命名空间中的函数。

不幸的是,C++ 标准不允许您将全局命名空间引入具有适当 using 语句的当前命名空间,尽管您可以使用 using ::Foo; 来拉入该特定函数:

void Foo(char)
{
}
struct Bar
{
    static void Foo(double) { }
    static void Foo() {
        using ::Foo;
        Foo('c'); // correct overload is found since ::Foo is pulled into scope
        Foo(3.0);
    }
};

否则,需要使用范围解析运算符来查找全局函数:

struct Bar
{
    static void Foo() { ::Foo(1); }
};

最新更新