11

単純な関数テンプレートを考えてみましょう。

template <typename T>
void FunctionTemplate(T t){
}

void MyFunction(){
    int a;
    FunctionTemplate(a);
    FunctionTemplate<int>(a);
}

()の最初の呼び出しFunctionTemplate(a)で、コンパイラは問題を提起する型を計算します。FunctionTemplate()を呼び出す2番目の方法が存在する理由、FunctionTemplate<int>(a)または最初のメソッドを使用できなかった説得力のある理由はありますか?

編集:私の用語は少しずれている可能性があるので、必要に応じて編集してください。

4

3 に答える 3

13

必要がない場合でも、テンプレート引数を指定したい場合があります。あなたの関数が型の引数を取り、Tあなたが持っているintが、関数がそれを。として取りたいとしましょうfloat。次に、明示的に言う必要がありますFunctionTemplate<float>(my_int)

テンプレートパラメータを推測できない場合もたくさんあります。次のことを考慮してください。

template <typename T>
T FunctionTemplate() {
  return T();
}

これをどのように呼んでも、テンプレート引数を指定しないと、タイプをT自動的に推測することはできません。この場合の単純な理由は、呼び出し元のサイトがリターンタイプが何であるかについて何も言わないことです。

用語について:テンプレート引数を指定しない場合、テンプレートは暗黙的にインスタンス化されます。テンプレート引数を指定すると、テンプレートが明示的にインスタンス化されます。

于 2013-03-09T19:37:23.550 に答える
9

関数をパラメーターとして別のメソッドに渡したいとします。

myAlgorithm( myFunction<int> );

または、関数の浮動小数点バージョンが速度に使用されることを保証したいとします。

myFunction<float>( 2.0 );

(書くのを忘れて2.0fも今は問題ありません)

于 2013-03-09T19:36:59.093 に答える
7

使用法は、コンパイラに特定のバージョンのテンプレート関数を使用するように強制することです。

template <typename T>
T func(T x, T y)
{
  // ...
}

int main()
{
  int x = 10;
  float y = 20;

  func(x, y); //ERROR no matching function for call to 'func(int&, float&)'

  func<float>(x, y); // OK, Uses float version of func
}
于 2013-03-09T19:43:01.013 に答える