带有函数指针和引用的模板参数推导

时间:2011-07-01 10:57:52

标签: c++ templates reference function-pointers

  

可能重复:
  Why are qualifiers of template arguments stripped when deducing the type?

考虑以下C ++代码:

void f(int&);

template <typename T> void tpl(void (*)(T), T);

void bar(int& x)
{
        tpl(&f, x);
}

使用GCC 4.6.0进行编译失败,并显示以下错误消息:

fntpl.cpp: In function ‘void bar(int&)’:
fntpl.cpp:7:11: error: no matching function for call to ‘tpl(void (*)(int&), int&)’
fntpl.cpp:7:11: note: candidate is:
fntpl.cpp:3:46: note: template<class T> void tpl(void (*)(T), T)

如果我明确说明模板参数(tpl<int&>(&f, x)),它就可以了。为什么模板参数推导在这种情况下不起作用?

1 个答案:

答案 0 :(得分:1)

因为这些根本不同

void f(int&);

void (*)(T)

编译器只推断出Tint,所以它寻找:

void f(int);

这与你的意图完全不同,将函数指针改为:

template <typename T> void tpl(void (*)(T&), T);

编译器会很开心......