W C++ określasz wewnętrzne powiązanie, zawijając definicje klas i funkcji w anonimowym obszarze nazw. Można również jawnie tworzyć instancje szablonów, ale aby standardy były zgodne z jawnymi wystąpieniami szablonów, muszą występować w tej samej przestrzeni nazw. AFAICT powinno to skompilować, ale GCC nie działa na niego:Czy anonimowy obszar nazw obejmuje wszystkie przestrzenie nazw?
namespace foo {
template<class T>
class bar {};
}
using namespace foo;
namespace {
template class bar<int>;
}
int main()
{
return 0;
}
z błędem:
namespace_test.cpp:11: error: explicit instantiation of 'class bar<int>' in namespace '<unnamed>' (which does not enclose namespace 'foo')
co ciekawe, ponieważ nazw anonimowy powinien być po prostu określenie powiązań, naprawdę nie funkcjonuje jako nazw i globalna przestrzeń nazw zdecydowanie obejmuje foo, ponieważ zamyka wszystkie przestrzenie nazw. Ale nawet to nie działa !:
template<class T>
class bar {};
using namespace foo;
namespace {
template class bar<int>;
}
int main()
{
return 0;
}
Które nie powiedzie się z powodu tego samego błędu, po prostu wymieniając nazw globalnego zamiast:
namespace_test.cpp:11: error: explicit instantiation of 'class bar<int>' in namespace '<unnamed>' (which does not enclose namespace '::')
:/
Która wersja GCC - lub które opcje kompilatora - lub która platforma? Próbowałem pierwszej próbki z G ++ 4.0.1 na MacOS X zi bez -Wall i skompilowałem ją bez skargi lub ostrzeżenia. –
GCC 4.2 w systemie Solaris. –