C++ 如何在仍然允许ADL等的情况下调用其他同名函数
如何在第二个C++ 如何在仍然允许ADL等的情况下调用其他同名函数,c++,C++,如何在第二个f()中进行调用,找到第一个f()进行非限定查找,以便ADL和正常名称查找规则仍能工作 注意:我不想更改任何函数的名称 namespace x { void f() { } class C { void f() { x::f(); } }; } 只需引入以下功能: void f() { using x::f; f(); // calls x
f()
中进行调用,找到第一个f()
进行非限定查找,以便ADL和正常名称查找规则仍能工作
注意:我不想更改任何函数的名称
namespace x
{
void f()
{
}
class C
{
void f()
{
x::f();
}
};
}
只需引入以下功能:
void f()
{
using x::f;
f(); // calls x::f()
}
之所以这样做,是因为要复制:
因为using声明将x::f引入了f的范围,而f的范围比C的范围窄。非限定查找会考虑本地块范围,找到匹配项,并在考虑更宽的类范围之前停止。由于没有函数参数,因此不存在依赖于参数的查找,因此不考虑其他作用域
您可以创建一个包装器:
namespace x
{
void f()
{
}
void call_f()
{
f();
}
class C
{
void f()
{
call_f();
}
};
}
::f()
不起作用?@barakmanos“使用非限定查找,因此ADL和正常名称查找规则仍能起作用”,这让我非常惊讶。我本以为这会导致一个模棱两可的电话。你能解释一下为什么没有发生吗?说实话,我也很惊讶。我正试图在标准中找到某种东西来区分这两个电话,但我做不到。对我来说,这似乎是一个萌芽的问题。除非你愿意,否则我会问的。@Angew我会问的。在这一点上,我像30分钟的超载解决方案,但仍然没有得到什么,所以现在我真的想知道。