コンパイラーは、インスタンス化できないテンプレートに対してエラーを出します。クラステンプレートのメンバー関数(私はあなたが意味していると思いますstatic_assert
)については、それは本当です、それでコンパイラはあなたに診断を与える権利があります。
条件を依存させ、インスタンス化されたときT
に常にfalseと評価されるようにする必要があります。たとえばのように
template<typename T>
struct always_false : std::false_type {};
template<typename T>
class ResourceJob : public IResourceJob
{
public:
void execute()
{
static_assert(always_false<T>::value,
"Specialised ResourceJob<T> not defined!");
}
};
コンパイラーは、ユーザーがスペシャライゼーションを設定するかどうかを知ることができないためalways_false
(もちろん、スペシャライゼーションを設定しません)、テンプレートを早期に拒否することはできなくなります。
execute
エラーメッセージはResourceJob
全体として特殊化する必要があることを示しているので、static_assertをに入れたかったのではないかと思います。したがってstatic_assert
、メンバー関数の外側をクラス本体に入れます。ユーザーがテンプレート全体を専門化するのではなく、メンバー関数のみを専門化するようにしたい場合、ユーザーは代わりに次のように言う必要があります。
// either "inline" and in the header, or not "inline" and in the .cpp file, but then
// put this into the header: template<> void ResourceJob<int>::execute();
template<> inline void ResourceJob<int>::execute() {
}
これにより、がの場合にexecute
テンプレートで使用される代替定義が提供されます。T
int