'<namespace>::<templated class>' の明示的なインスタンス化は名前空間 '<namespace>' で行わなければなりません(C++)

提供: RAD Studio
移動先: 案内検索

コンパイラのエラーと警告(C++):インデックス への移動


Clang 拡張コンパイラで以下をコンパイルしようとするとこのエラーが表示されます。

namespace N {
  template<typename T> 
  class TTest
  {
  };
}

using namespace N;
template class TTest<int>;
メモ: gcc が上記のコードのスニペットを拒否することなく受け入れたとしても、ここでは Clang がここでは正しいことになります。他のコンパイラは、この標準変更にまだ対応していません(Bug 60786 参照)。

これは、Clang 実装の 不具合レポート#275 です。DR275 で記載の通り、主な問題は以下の通りです: > "明示的なインスタンス化は、テンプレートの名前空間の括弧内で記述されるべきです。 > 明示的なインスタンス化で宣言された名前が非限定名の場合、 > 明示的なインスタンス化はテンプレートが宣言された名前空間内になければなりません。"

回避策は、次にあるように限定名を使用します:

namespace N {
  template<typename T> 
  class TTest
  {
  };
}
//using namespace N;
template class N::TTest<int>;

関連項目