'<namespace>::<templated class>' の明示的なインスタンス化は名前空間 '<namespace>' で行わなければなりません(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>;