3

特殊化せずにC++テンプレートが使用されるのを防ぐことは可能ですか?

たとえば、私は

template<class T>
void foo() {}

foo<int>そして、またはに特化せずに使用したくありませんfoo<char>

4

3 に答える 3

8

一般的なケースでは、実際に関数を定義せずに関数を宣言できるはずです。これにより、特殊化されていないテンプレートへの参照により、未定義のシンボル リンカ エラーが発生します。

template<class T>
void foo();

template<>
void foo<int>() {
    // do something here
}

これは、私にとってはうまく機能しclang++ます。

于 2012-09-11T02:53:59.260 に答える
1

関数の本体で未定義の型を使用できます。そして、コンパイル時のエラーメッセージが表示されます:

template<class T> struct A;  
template<class T>  
void foo()  
{  
   typename A<T>::type a;  // template being used without specialization!!!
   cout << "foo()\n";  
}  
template<>  
void foo<int>()  
{  
   cout << "foo<int>\n";  
}  
template<>  
void foo<char>()  
{  
   cout << "foo<char>\n";  
}  
int main()  
{  
  foo<int>();  
  foo<char>();  
//  foo<double>();   //uncomment and see compilation error!!!
}  
于 2012-09-11T07:16:57.817 に答える
-1

foo 関数にパラメータがある場合に可能です。例: template void foo(T param){} これで、特殊化せずに foo(1), foo('c') を呼び出すことができます。

于 2012-09-11T02:46:53.233 に答える