没有匹配函数来调用std :: list :: remove_if(function():: predicate)

时间:2014-01-13 16:55:19

标签: c++ predicate stdlist argument-dependent-lookup

那么,不允许在函数内定义谓词并使用std::list::remove_if参数?


考虑以下代码,无法编译:

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)’

现在,如果我用

替换l.remove_if( pred() );
pred()( *l.begin() );
// or
pred p;
p( *l.begin() );

remove_if在内部执行,它按预期编译并运行。

还有更多:如果我将struct pred移动到 main之外,那么这两个测试都会按预期工作。


这不会让任何感觉到我。

我认为它可能是依赖名称和ADL以及类似的东西,但是...... remove_if的参数是实例,而不是类型。这是真的,这是一个模板函数,参数的类型仍然被解析,但是..

有人可以解释为什么以及为什么会这样?

1 个答案:

答案 0 :(得分:4)

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

  

本地类型,没有链接的类型,未命名的类型或类型   任何这些类型的复合不得用作   模板类型参数的模板参数。

由于remove_if是模板,因此不能使用本地谓词作为参数。