为什么std :: bind无法解析多个参数的函数重载?

时间:2015-08-15 02:00:26

标签: templates c++11 lambda std-function

请考虑以下示例:

#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。

1 个答案:

答案 0 :(得分:4)

当C ++编译器看到std::bind(&f,1,placeholders::_1)的调用时,它不知道参数之间的任何关系。只有在实例化模板时,关系才可见。要实例化它,编译器需要模板参数。但是&f是一个重载函数,所以它没有定义的类型。因此,C ++编译器无法实例化模板,因此即使在可以看到任何关系之前编译也会失败。

您可以通过明确指定类型来解决此问题:

std::bind(static_cast<void(*)(int,int)>(&f),1,placeholders::_1);