0

私は次のコードを持っています:

template<typename T>
void bar(int x, T y)
{
}

void baz(int x, int y)
{
}

template<typename T0, typename T1>
void foo(void k(T0, T1), T1 t)
{
}

int main()
{
  foo(baz, 10); // OK
  foo(bar, 10); // ERROR
  return 0;
}

の過負荷解決はfoo、を渡すときに正しく機能しbazます。ただし、関数テンプレートを渡す場合、スコープにテンプレート引数が1つしかない場合でも、コンパイラはのテンプレート引数をbar推測できず、最初の引数は完全にに解決されます。のような呼び出しをコンパイラで解決できるように関数テンプレートを作成するにはどうすればよいですか?T0foobarintfoofoo(bar, 10)

4

2 に答える 2

0

できるよ:

  void (&b)(int,int) = bar;
  foo(b, 10);
于 2012-08-16T23:04:38.023 に答える
0

14.8.2.1/6 (関数呼び出しからのテンプレート引数の推定) はこれに答えます:

Pが関数型、関数型へのポインター、またはメンバー関数型へのポインターである場合:

  • 引数が 1 つ以上の関数テンプレートを含むオーバーロード セットである場合、パラメーターは推定されないコンテキストとして扱われます。

あなたの場合、bar関数テンプレートであるため、引数kは関数テンプレートを含むオーバーロード セットの関数型です。したがって、 のテンプレート引数bar<T>は演繹できません。

これの実際的な理由として、foo(bar<int>, 10)foo(bar<long>, 10)はどちらも完全に実行可能な呼び出しであり、暗黙のうちに選択が行われるわけではないことを考慮してください。整数リテラルの型はvalueに依存することに注意してください。また、 とが異なるテンプレートの特殊化を生成するfoo(bar, 10)と、おかしなことになります。foo(bar, 100000000)

于 2012-08-14T22:57:37.040 に答える