在 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 '::')
:/