2014-01-13 49 views
2

因此,在函数中定义一个谓词并使用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参数为实例,而不是一个类型。这是事实,这是一个模板功能,参数的类型仍然解决,但.. ..

有人可以解释什么和为什么会发生?

+9

确保您使用的是C++ 11。在C++ 98中,你不能使用本地类作为模板参数。 –

回答

4

第一个问题的答案是,在C++ 11之前,某些类型(如本地类型)不允许作为模板参数。见14.3.1/2:

本地型,无键的类型,未命名的类型或类型 从任何这些类型不应被用作模板类型参数 模板参数的混。

由于remove_if是一个模板,所以不能使用本地谓词作为其参数。

+0

我明白了。对我而言,这更像是一种限制,而不是一个缺失的功能,我不明白为什么它在旧标准中。对我来说没有意义。这很有趣。 –