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

C++ 哪个查找规则阻止编译器查找函数?,c++,C++,上面的代码无法编译。它找不到Foo(int)。为什么?我知道这与具有相同的函数名有关,但没有进一步了解这个问题 为什么我需要合格的查找?来自3.4.1(强调我的) 在3.4.1中列出的所有情况下,都会按照每个 各自类别;一旦找到名称的声明,名称查找就会结束。如果没有声明 如果发现,程序的格式不正确 在这种特殊情况下,要搜索的第一个作用域是函数局部作用域。在那里找不到Foo。然后是类范围。由于在其中找到了名称Foo,因此名称查找在此停止,而另一个Foo根本不参与重载解析。如果特定命名空间中的函数与

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

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

来自3.4.1(强调我的)

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


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

如果特定命名空间中的函数与全局命名空间中的函数共享相同的名称,则无法找到全局命名空间中的函数

遗憾的是,C++标准不允许您使用“<代码> >使用< /COD>语句,将全局命名空间引入当前代码空间,尽管您可以使用<代码>:代码>要拉入该特定功能:

void Foo(int i)
{
}
struct Bar
{
    static void Foo() { Foo(1); }
};
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);
    }
};
否则,您需要使用范围解析运算符来查找全局函数:

void Foo(int i)
{
}
struct Bar
{
    static void Foo() { Foo(1); }
};
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);
    }
};

在类作用域中查找并停止,因为它找到了一个匹配的函数名on@StoryTeller:绝对!我掐住了它。啊哼,很高兴能帮上忙。但它在类范围内是不正确的。必须位于成员函数内部。这就是为什么我链接到的示例比OP的更详细。当它不仅仅是一条额外的线时进行演示。如果你愿意的话,你也可以掐一下:)我想是时候去维基了@它被称为一个。老如C++本身,但许多教程跳过它出于某种原因…想想看,在大多数教程中,名称空间通常没有得到应有的尊重,而且这些都非常有用。应该提到的是,在某些情况下,即使在没有ADL的情况下找到声明(尽管不是OP的确切情况),非限定查找也会出现这种情况