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。但是,当传入函数 templatebar时,编译器无法推断 的模板参数T0foo即使bar范围内只有一个,并且它的第一个参数完全解析为int。如何编写函数模板以便编译器可以解析foo调用?foo(bar, 10)

4

2 回答 2

0

14.8.2.1/6(从函数调用中推导出模板参数)回答了这个问题:

WhenP是函数类型、指向函数类型的指针或指向成员函数类型的指针:

  • 如果参数是包含一个或多个函数模板的重载集,则该参数被视为非推导上下文。

在您的情况下,bar是一个函数模板,因此参数k是函数类型,其重载集包含函数模板。因此,模板参数 forbar<T>是不可推导出的。

作为这样做的实际原因,请考虑foo(bar<int>, 10)foo(bar<long>, 10)都是完全可行的电话,并且不会隐含地为您做出选择。请记住,整数文字的类型取决于value ,如果生成不同的模板特化foo(bar, 10),那就很奇怪了。foo(bar, 100000000)

于 2012-08-14T22:57:37.040 回答
0

你可以做:

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