explizite Instantiierung von '<namespace>::<templated class>' muss im Namespace '<namespace>' (C++) vorkommen

Aus RAD Studio
Wechseln zu: Navigation, Suche

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>;

Siehe auch