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); }
};