2017-05-25 96 views
0

考虑下面的代码的std ::函数的std ::绑定拉姆达超载歧义

class my_class { 
public: 
struct my_struct { 
    int i; 
}; 
std::function<void(my_struct&)> func; 
my_class() { 
    func = std::bind([this](my_struct& s) { s.i = 5; }); 
} 
}; 

在2017年VS我收到以下错误:

错误C2440:初始化:不能从转换'std :: _ Binder>'到'std :: function' 注意:没有构造函数可以采用源类型,或者构造函数的重载解析模糊不清

有什么想法可以解决模糊问题?

回答

3

这是有史以来最没有帮助的编译器错误。问题是,你想

func = std::bind([this](my_struct& s) { s.i = 5; }, std::placeholders::_1); 
//             ^^^^^^^^^^^^^^^^^^^^^ 

std::bind(f)的意思是“给我一个g,从而g(/* anything */)f()

你需要的,如果你想通过传递参数使用占位符。

(我假设你的真实代码做的比这更复杂一些,因为你不需要bind或在你显示的代码中捕获this)。

+0

感谢此工作! – schuess

2

std::bind或多或少已经在C++ 11中过时了。只需使用lambda代替。

class my_class 
{ 
public: 
    struct my_struct { 
    int i; 
    }; 
    my_class() 
    : func ([](my_struct& s) { s.i = 5; }) {} 
private: 
    std::function<void(my_struct&)> func; 
}; 
+0

Y你的意思是C++ 14。你仍然需要'std :: bind'来支持将东西移动到C++ 11中的lambda上下文中,而不是复制。 – StoryTeller

+0

@StoryTeller在C++ 11中它*几乎*过时(我说*或多或少*)。在C++ 14中,它甚至更多(完全?)过时。 – Walter

+0

如果有实际需要的用例,我不认为可以说它已经过时了。但也许我只是分裂头发。它在C++ 14中绝对没有用处。 – StoryTeller