En C++, especifica vínculos internos al incluir sus definiciones de clases y funciones dentro de un espacio de nombres anónimo. También puede crear instancias explícitas de plantillas, pero para ser estándares que cumplan cualquier instancia explícita de las plantillas debe ocurrir en el mismo espacio de nombres. AFAICT esto debe compilar, pero GCC falla en él:¿El espacio de nombre anónimo encierra todos los espacios de nombres?
namespace foo {
template<class T>
class bar {};
}
using namespace foo;
namespace {
template class bar<int>;
}
int main()
{
return 0;
}
con el error:
namespace_test.cpp:11: error: explicit instantiation of 'class bar<int>' in namespace '<unnamed>' (which does not enclose namespace 'foo')
cual es interesante debido a que el espacio de nombres en el anonimato simplemente se debe especificar la vinculación, en realidad no funciona como un espacio de nombres, y el espacio de nombre global definitivamente incluye foo, ya que incluye cada espacio de nombre. Pero incluso esto no funciona !:
template<class T>
class bar {};
using namespace foo;
namespace {
template class bar<int>;
}
int main()
{
return 0;
}
Qué falla con el mismo error, simplemente hacer una lista del espacio de nombres global en su lugar:
namespace_test.cpp:11: error: explicit instantiation of 'class bar<int>' in namespace '<unnamed>' (which does not enclose namespace '::')
:/
¿Qué versión de GCC, o qué opciones de compilador, o qué plataforma? Probé la primera muestra con G ++ 4.0.1 en MacOS X con y sin -Wall y se compiló sin queja o advertencia. –
GCC 4.2 en Solaris. –