考虑以下代码片段:
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).
}
在这种情况下,我如何引用匿名命名空间内的某些内容?
你不能。该标准包含以下部分(§7.3.1.1,C++03):
未命名的命名空间定义的行为就好像它被替换为
namespace unique { /* empty body */ }
using namespace unique;
namespace unique { namespace-body }
其中所有出现的唯一的 翻译单元被替换为 相同的标识符和这个标识符 与整个程序中的所有其他标识符不同。
因此您无法引用该唯一名称。
但是,从技术上讲,您可以使用如下所示的内容来代替:
int i;
namespace helper {
namespace {
int i;
int j;
}
}
using namespace helper;
void f() {
j++; // works
i++; // still ambigous
::i++; // access to global namespace
helper::i++; // access to unnamed namespace
}
虽然 Georg 给出了符合标准、正确、正确且值得尊敬的答案,但我想提供我的黑客答案 - 在匿名命名空间中使用另一个命名空间:
#include <iostream>
using namespace std;
namespace
{
namespace inner
{
int cout = 42;
}
}
int main()
{
cout << inner::cout << endl;
return 0;
}
我能想到的唯一不修改现有命名空间安排的解决方案是将
main
委托给匿名命名空间中的函数。 (main
本身必须是全局函数(§3.6.1/1),因此它不能位于匿名命名空间中。)
void Foo() // 1
{
}
namespace
{
void Foo() // 2
{
}
}
namespace { // re-open same anonymous namespace
int do_main()
{
Foo(); // Calls local, anonymous namespace (Foo #2).
::Foo(); // Calls the Foo in the global namespace (Foo #1).
return 0; // return not optional
}
}
int main() {
return do_main();
}
唯一真正的方法是将要访问该命名空间的代码放在命名空间本身中。否则无法解析未命名的命名空间,因为它没有标识符,您可以给它来解决不明确的解析问题。
如果您的代码位于 namespace{} 块本身内,则本地名称的优先级高于全局名称,因此 Foo() 将调用您的命名空间内的 Foo(),而 ::Foo() 将调用位于以下位置的命名空间全球范围。
只需重命名本地命名空间函数即可。