请考虑以下示例:
#include <iostream>
#include <functional>
using namespace std;
void f(int x,int y) {}
// void f(int x) {} // if this line is uncommented, code does not compile.
int main() {
auto functor = std::bind(&f,1,placeholders::_1);
cout << "works!" << endl;
return 0;
}
它编译并运行正常(https://ideone.com/fork/2SywE2),但取消注释注释行会导致编译器错误:
prog.cpp:在函数'int main()'中: prog.cpp:10:48:错误:没有匹配函数来调用'bind(,int,const std :: _ Placeholder&lt; 1&gt;&amp;)' auto functor = std :: bind(&amp; f,1,placeholders :: _ 1); ^ 在prog.cpp中包含的文件中:2:0: / usr / include / c ++ / 5 / functional:1462:5:note:candidate:template typename std :: _ Bind_helper :: value,_Func,_BoundArgs ...&gt; :: type std :: bind(_Func&amp;&amp;, _BoundArgs&amp;&amp; ...) 绑定(_Func&amp;&amp; __f,_BoundArgs&amp;&amp; ... __args) ^ / usr / include / c ++ / 5 / functional:1462:5:注意:模板参数推导/替换失败: prog.cpp:10:48:注意:无法推断模板参数'_Func' auto functor = std :: bind(&amp; f,1,placeholders :: _ 1); ^ 在prog.cpp中包含的文件中:2:0: / usr / include / c ++ / 5 / functional:1490:5:note:candidate:template typename std :: _ Bindres_helper&lt; _Result,_Func,_BoundArgs&gt; :: type std :: bind(_Func&amp;&amp;,_BoundArgs&amp;&amp;。 ..) 绑定(_Func&amp;&amp; __f,_BoundArgs&amp;&amp; ... __args) ^ / usr / include / c ++ / 5 / functional:1490:5:注意:模板参数推断/替换失败: prog.cpp:10:48:注意:无法推断模板参数'_Result' auto functor = std :: bind(&amp; f,1,placeholders :: _ 1);
如果存在多个重载,为什么std :: bind无法解析模板参数,因为重载具有不同的输入参数,并且调用bind意味着输入参数的数量为2。
答案 0 :(得分:4)
当C ++编译器看到std::bind(&f,1,placeholders::_1)
的调用时,它不知道参数之间的任何关系。只有在实例化模板时,关系才可见。要实例化它,编译器需要模板参数。但是&f
是一个重载函数,所以它没有定义的类型。因此,C ++编译器无法实例化模板,因此即使在可以看到任何关系之前编译也会失败。
您可以通过明确指定类型来解决此问题:
std::bind(static_cast<void(*)(int,int)>(&f),1,placeholders::_1);