未命名命名空间内的函数与外部的函数之间存在歧义
考虑以下代码片段:
void Foo() // 1
{
}
namespace
{
void Foo() // 2
{
}
}
int main()
{
Foo(); // Ambiguous.
::Foo(); // Calls the Foo in the global namespace (Foo #1).
// I'm trying to call the `Foo` that's defined in the anonymous namespace (Foo #2).
}
在这种情况下,我如何引用匿名名称空间内的某些内容?
Consider the following snippet:
void Foo() // 1
{
}
namespace
{
void Foo() // 2
{
}
}
int main()
{
Foo(); // Ambiguous.
::Foo(); // Calls the Foo in the global namespace (Foo #1).
// I'm trying to call the `Foo` that's defined in the anonymous namespace (Foo #2).
}
How can I refer to something inside an anonymous namespace in this case?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
你不能。该标准包含以下部分(§7.3.1.1,C++03):
因此您无法引用该唯一名称。
然而,从技术上讲,您可以使用如下所示的内容:
You can't. The standard contains the following section (§7.3.1.1, C++03):
Thus you have no way to refer to that unique name.
You could however technically use something like the following instead:
虽然 Georg 给出了符合标准、正确、正确且值得尊敬的答案,但我想提供我的 hacky 答案 - 在匿名命名空间中使用另一个命名空间:
While Georg gives standard-complient, correct, right, and respectable answer, I'd like to offer my hacky one - use another namespace within the anonymous namespace:
我能想到的唯一不修改现有命名空间安排的解决方案是将 main 委托给匿名命名空间中的函数。 (
main
本身必须是全局函数(§3.6.1/1),因此它不能位于匿名命名空间中。)The only solution I can think of that doesn't modify the existing namespace arrangement is to delegate
main
to a function in the anonymous namespace. (main
itself is required to be a global function (§3.6.1/1), so it cannot be in an anonymous namespace.)唯一真正的方法是将要访问该名称空间的代码放在名称空间本身中。否则无法解析未命名的名称空间,因为它没有标识符,您可以为其提供解决模糊解析问题的标识符。
如果您的代码位于 namespace{} 块本身内,则本地名称的优先级高于全局名称,因此 Foo() 将调用名称空间内的 Foo(),而 ::Foo() 将调用全局名称空间范围。
The only real way is to put the code you want to access that namespace within the namespace itself. There's no way to resolve to the unnamed namespace otherwise, since it has no identifier you can give it to solve the ambiguous resolution problem.
If your code is inside the namespace{} block itself, the local name gets priority over the global one, so a Foo() will call the Foo() within your namespace, and a ::Foo() will call the namespace at global scope.
只需重命名本地命名空间函数即可。
Just rename the local namespace function.