可能重复:
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)
),它就可以了。为什么模板参数推导在这种情况下不起作用?
答案 0 :(得分:1)
因为这些根本不同
void f(int&);
和
void (*)(T)
编译器只推断出T
是int
,所以它寻找:
void f(int);
这与你的意图完全不同,将函数指针改为:
template <typename T> void tpl(void (*)(T&), T);
编译器会很开心......