virtual Answer<const Taaal& const> askWho(bool(const Taaal& const)) = 0;
virtual Answer<const Taaal& const> askWho(const Taaal& const t) {
return askWho([&](auto q) {
return q == t;
});
}
被拒绝,“没有重载函数的实例与参数列表匹配”(另外,我被告知auto不被允许,但用显式类型替换它会留下第一个问题)
Taaal是声明这些方法的(抽象)类。答案是#included来自另一个标题,其定义无关紧要。
答案 0 :(得分:2)
只有无捕获的lambda定义了对函数指针的隐式转换。由于捕获默认值&
,您的lambda表达式捕获其上下文。由于lambda不能是无状态的,因此可以更改其他重载的参数类型
virtual Answer<const Taaal&> askWho(std::function<bool(const Taaal&)>) = 0;
如果你的lambda不需要捕获上下文变量,你可以从捕获列表中删除&
,转换将按预期工作
virtual Answer<const Taaal&> askWho(const Taaal& t) {
return askWho([](auto q) {
// ^^ - nothing here
return ...;
});
}
请注意,只有在C ++ 14模式下编译代码(gcc和clang上为auto q
)时,lambda的-std=c++1y
参数类型才有效。在C ++ 11模式中,您将指定参数类型。
答案 1 :(得分:0)
auto in lambdas只允许在C ++ 14中使用。
您必须使用真实参数类型,多态lambda不包含在C ++ 11中。