【发布时间】:2009-07-10 21:11:36
【问题描述】:
在 C++ 中,您通过将类和函数定义包装在匿名命名空间中来指定内部链接。您也可以显式实例化模板,但要成为符合模板的任何显式实例化的标准,必须出现在同一命名空间中。 AFAICT 这应该可以编译,但 GCC 失败了:
namespace foo {
template<class T>
class bar {};
}
using namespace foo;
namespace {
template class bar<int>;
}
int main()
{
return 0;
}
出现错误:
namespace_test.cpp:11: error: explicit instantiation of 'class bar<int>' in namespace '<unnamed>' (which does not enclose namespace 'foo')
这很有趣,因为匿名命名空间应该只是指定链接,而不是真正用作命名空间,并且全局命名空间肯定包含 foo,因为它包含每个命名空间。但即使这样也行不通!:
template<class T>
class bar {};
using namespace foo;
namespace {
template class bar<int>;
}
int main()
{
return 0;
}
失败并出现同样的错误,只是列出了全局命名空间:
namespace_test.cpp:11: error: explicit instantiation of 'class bar<int>' in namespace '<unnamed>' (which does not enclose namespace '::')
:/
【问题讨论】:
-
哪个版本的 GCC - 或者哪个编译器选项 - 或者哪个平台?我在带有和不带有 -Wall 的 MacOS X 上使用 G++ 4.0.1 尝试了第一个示例,它编译时没有抱怨或警告。
标签: c++ namespaces global anonymous linkage