explizite Instantiierung von '<namespace>::<templated class>' muss im Namespace '<namespace>' (C++) vorkommen
Nach oben zu Compiler-Fehler und -Warnungen (C++) - Index
Sie sehen diesen Fehler, wenn Sie versuchen, den folgenden durch Clang erweiterten Compiler zu compilieren:
namespace N {
template<typename T>
class TTest
{
};
}
using namespace N;
template class TTest<int>;
- Hinweis: Selbst wenn gcc das Codefragment, das oben ohne Einwand angezeigt wird, akzeptiert, scheint es, dass Clang dort richtig ist; die anderen Compiler haben die Standardänderungen noch nicht übernommen (siehe: Bug 60786 (EN)).
Dies ist Clang, das Defect Report #275 (EN) implementiert. Wie in DR275 erwähnt, ist das zentrale Problem:
> "An explicit instantiation shall appear in an enclosing namespace of its template.
> If the name declared in the explicit instantiation is an unqualified name, the
> explicit instantiation shall appear in the namespace where its template is declared."
Das Workaround muss die qualifizierten Namen verwenden, wie in:
namespace N {
template<typename T>
class TTest
{
};
}
//using namespace N;
template class N::TTest<int>;