gpt4 book ai didi

c++: ptr_fun() 错误信息

转载 作者:太空宇宙 更新时间:2023-11-04 11:41:31 25 4
gpt4 key购买 nike

以下是简单的测试程序。它试图找到(案例 1)并删除(案例 2)字符串中的第一个空格。下面是测试结果:

1) 第 1 行导致“没有匹配函数调用 find_if(...)”错误。这是因为它试图找到 std::isspace() , 而不是全局 isspace() .所以第 2 行没问题。

2) 如果包装 isspace()函数 ptr_fun() ,比如第3行和第4行,第3行会导致“no matching function for call to ptr_fun(...)”错误,第4行没问题。

3) 第 5 行导致“没有匹配函数调用 not1(...)”错误。第 6 行生成大量错误消息,包括“不匹配调用 (std::unary_negate<int(int)throw ()>) (char&)”。

4) 通过ptr_fun() 包装,第7 行和第8 行都可以,无论是global 还是std isspace() .

所以:

1) 为什么我们需要 ptr_fun()在情况 2 中而不在情况 1 中?

2) 为什么 std::isspace()ptr_fun() 一起工作在情况 2 中而不是在情况 1 中?如何isspace()解决了吗?

3)ptr_fun()的真正目的是什么? (以及其他类似的 STL 仿函数)及其工作原理?

谢谢。

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
string s = " abc";

// case 1 (find the first space):
// find_if(s.begin(), s.end(), isspace); // line 1 (error)
// find_if(s.begin(), s.end(), ::isspace); // line 2 (ok)

// find_if(s.begin(), s.end(), ptr_fun(isspace)); // line 3 (error)
// find_if(s.begin(), s.end(), ptr_fun(::isspace)); // line 4 (ok)

// case 2 (trim leading spaces):
// s.erase(s.begin(), find_if(s.begin(), s.end(), not1((isspace)))); // line 5 (error)
// s.erase(s.begin(), find_if(s.begin(), s.end(), not1((::isspace)))); // line 6 (error)

// s.erase(s.begin(), find_if(s.begin(), s.end(), not1(ptr_fun<int, int>(::isspace)))); // line 7 (ok)
// s.erase(s.begin(), find_if(s.begin(), s.end(), not1(ptr_fun<int, int>(std::isspace)))); // line 8 (ok)

return 0;
}

最佳答案

首先,你需要包含<cctype>使用前 isspace .但是执行此操作后第 1 行可能仍会出错,因为由于 isspace 的过载导致调用不明确。在 <locale> 中提供这可能包含在您包含的其他标准库 header 之一中。不需要 ptr_fun要消除歧义,只需使用 static_cast

find_if(s.begin(), s.end(), static_cast<int(*)(int)>(isspace));

关于 not1 的问题,这要求传递给它的谓词定义一个名为 argument_type 的类型, 包装在 ptr_fun为你做。 ptr_fun 的目的|是包装一个(非成员)函数接受一个或两个参数。 C++11 弃用它,取而代之的是 std::function .

如果你的编译器支持 lambda 表达式,你可以去掉 not1ptr_fun电话。

s.erase(s.begin(), find_if(s.begin(), s.end(), [](char c) {return !isspace(c)}));

关于c++: ptr_fun() 错误信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21191132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com