In C++ geben Sie die interne Bindung an, indem Sie Ihre Klassen- und Funktionsdefinitionen in einem anonymen Namespace einschließen. Sie können Templates auch explizit instanziieren, jedoch müssen Standards, die expliziten Instanziierungen der Templates entsprechen, im selben Namespace vorkommen. AFAICT sollten diese kompilieren, aber GCC nicht darauf:Umfasst der anonyme Namespace alle Namespaces?
namespace foo {
template<class T>
class bar {};
}
using namespace foo;
namespace {
template class bar<int>;
}
int main()
{
return 0;
}
Mit dem Fehler:
namespace_test.cpp:11: error: explicit instantiation of 'class bar<int>' in namespace '<unnamed>' (which does not enclose namespace 'foo')
was interessant ist, da der anonyme Namespace sollte nur Verknüpfung spezifiziert werden, nicht wirklich als Namespace funktioniert, und Der globale Namespace umschließt definitiv foo, da er jeden Namespace einschließt. Aber auch dies nicht funktioniert !:
template<class T>
class bar {};
using namespace foo;
namespace {
template class bar<int>;
}
int main()
{
return 0;
}
Welche nicht mit dem gleichen Fehler, nur die globalen Namespace-Eintrag statt:
namespace_test.cpp:11: error: explicit instantiation of 'class bar<int>' in namespace '<unnamed>' (which does not enclose namespace '::')
:/
Welche Version von GCC - oder welche Compiler-Optionen - oder welche Plattform? Ich habe das erste Beispiel mit G ++ 4.0.1 auf MacOS X mit und ohne -Wall ausprobiert und es ohne Beanstandung oder Warnung kompiliert. –
GCC 4.2 unter Solaris. –