In C++ si specifica il collegamento interno mediante il wrapping delle definizioni di classi e funzioni all'interno di uno spazio dei nomi anonimo. È anche possibile creare istanze esplicite di modelli, ma per essere standard conformi a qualsiasi istanziazione esplicita dei modelli deve verificarsi nello stesso spazio dei nomi. AFAICT questo dovrebbe compilare, ma GCC fallisce su di esso:Lo spazio dei nomi anonimo racchiude tutti gli spazi dei nomi?
namespace foo {
template<class T>
class bar {};
}
using namespace foo;
namespace {
template class bar<int>;
}
int main()
{
return 0;
}
con l'errore:
namespace_test.cpp:11: error: explicit instantiation of 'class bar<int>' in namespace '<unnamed>' (which does not enclose namespace 'foo')
Il che è interessante perché il namespace anonimo deve solo essere specificando il collegamento, non proprio funzionare come uno spazio dei nomi, e il namespace globale racchiude definitivamente foo, poiché racchiude ogni spazio dei nomi. Ma anche questo non funziona !:
template<class T>
class bar {};
using namespace foo;
namespace {
template class bar<int>;
}
int main()
{
return 0;
}
che non riesce con lo stesso errore, appena messa in vendita di namespace globale, invece:
namespace_test.cpp:11: error: explicit instantiation of 'class bar<int>' in namespace '<unnamed>' (which does not enclose namespace '::')
:/
Quale versione di GCC - o quali opzioni del compilatore - o quale piattaforma? Ho provato il primo campione con G ++ 4.0.1 su MacOS X con e senza -Wall e si è compilato senza lamentele o avvisi. –
GCC 4.2 su Solaris. –