因此,在函数中定义一个谓词并使用std::list::remove_if
参数是不允许的?对std :: list :: remove_if(function():: predicate)调用没有匹配函数
考虑下面的代码,从而未能编译:
struct a { };
int main()
{
struct pred { bool operator()(const a&) { return false; } };
std::list<a> l; // fill l
l.remove_if(pred());
return 0;
}
error: no matching function for call to
‘std::list<a, std::allocator<a> >::remove_if(main()::pred)’
现在,如果我有
pred()(*l.begin());
// or
pred p;
p(*l.begin());
这remove_if
内部确实取代了l.remove_if(pred());
,它编译和作品如预期。
甚至更多:如果我将struct pred
被定义外为主,兼顾测试正常工作。
此不作任何感我。
我认为这可能是一些具有相关的名称和ADL和这样的事情,但是...的remove_if
参数为实例,而不是一个类型。这是事实,这是一个模板功能,参数的类型仍然解决,但.. ..
有人可以解释什么和为什么会发生?
确保您使用的是C++ 11。在C++ 98中,你不能使用本地类作为模板参数。 –