没有匹配函数调用 std::list::remove_if( function()::p redicate )
no matching function for call to std::list::remove_if( function()::predicate )
那么,不允许在函数中定义谓词并用作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
的参数是一个实例,而不是一个类型。确实,这是一个模板函数,参数的类型仍然解析,但是..
有人可以解释什么以及为什么会发生吗?
第一个问题的答案是,是的,在 C++11 之前,某些类型(例如本地类型)不允许作为模板参数。参见 14.3.1/2:
本地类型、没有链接的类型、未命名类型或类型 从任何这些类型复合不得用作 模板类型参数的模板参数。
由于remove_if
是模板,因此不能使用本地谓词作为其参数。
相关文章:
- 我的简单if-else语句是如何无法访问的代码
- 如何将enable-if与模板参数和参数包一起使用
- 无论条件是否为true,if总是在c++中执行
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- Insert函数不适用于2 if语句C++
- If语句未被求值C++
- C++嵌套if语句,基本货币交换
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 是否可以使用if constexpr删除控制流语句
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 如何删除peer if else分支中的冗长句子
- 我似乎对if/else的基本语句有问题:/
- if数组上的随机数
- 将按位if条件转换为普通if条件
- If语句在c++中被忽略
- 比较if语句中的数组值和int值
- 使用if-else将数字转换为单词
- 为什么简单的算术减法在"if"条件下不起作用?
- 以在Qt中的IF语句中设置时间延迟
- Craps游戏问题,忽略if语句