2011-08-04 7 views
5

特殊化が明示的に書かれていない型に対して、テンプレート関数を使って何とか禁止することはできますか?私は私が専門としようとすると、そのfooはテンプレート関数ではありません、私はコンパイラが言うそして原因、関数のジェネリックバージョンをスキップすることができないブロック非特異的なテンプレートC++

template <typename T> 
void foo(){} 

template <> 
void foo<int>(){} 

int main(int argc, char* argv[]){ 
    foo<int>(); //ok 
    foo<char>(); //Wrong - no specialized version for char. 
} 

のようなものを意味します。私は単純にジェネリック関数でコンパイルされないものを書き、何らかの理由を説明するコメントを追加することができますが、これは非常に参考になりません。私がしたいのは、コンパイラに "foo()is not defined"のようなエラーが出るようにすることです。

答えて

13

確かに:ちょうどそれを定義しないと、あなたがそれを使用しようとリンカエラーが発生します:

template <typename T> 
void foo(); // not defined 

template <> 
void foo<int>() { } 

また、あなたが「よりよいを与えるために、静的アサートのいくつかのバリエーションを使用することができます"コンパイル時エラー。ここでは、C++ 0x static_assertを使用した例を示します。テンプレートパラメータに応じてfalseの値を変更する必要があります。そうでない場合は、テンプレートを解析するときにstatic_assertがトリガーされる可能性があります。

template <typename T> 
struct dependent_false { enum { value = false }; }; 

template <typename T> 
void foo() 
{ 
    static_assert(dependent_false<T>::value, "Oops, you used the primary template"); 
} 

通常、最も良いのはnot to specialize function templatesです。代わりに、特殊なクラステンプレートに委任する方がよい:

template <typename T> 
struct foo_impl 
{ 
    static_assert(dependent_false<T>::value, "Oops, you used the primary template"); 
}; 

template<> 
struct foo_impl<int> 
{ 
    static void foo() { } 
}; 

template <typename T> 
void foo() 
{ 
    return foo_impl<T>::foo(); 
} 
4

もちろん、デフォルトの汎用テンプレートの定義は入力しないでください。

関連する問題