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