gpt4 book ai didi

c++ - remove_if(str.begin(), str.end(),::isspace);::isspace 是什么意思?

转载 作者:太空狗 更新时间:2023-10-29 20:03:28 27 4
gpt4 key购买 nike

我最近想找到一种使用 STL 修剪字符串的方法。我看到有人用

remove_if(str.begin(), str.end(), isspace);

我找到了 isspace是STL中的一个函数,header是<ctype.h> .我将上面的代码和头文件放在我的函数中,然后它无法通过编译。编译器提示 isspace .

我试试

remove_if(str.begin(), str.end(), std::isspace);

还是编译不过。

然后我发现另一个人在用

remove_if(str.begin(), str.end(), ::isspace);

我试试这个,它可以通过编译。

我的问题是

  1. 为什么我用前两种方式都编译不通过

  2. ::isspace 是什么意思?方法?是要提它属于STL还是别的?我对 :: 的用法感到困惑?

最佳答案

std::isspace是 C++ 中的重载函数,模板函数在 <locale> 中声明.允许实现以静默方式包含您没有要求的额外 header ,许多实现都这样做了。他们这样做是因为他们在内部使用了这些额外的 header 。

通常,参数传递给 std::isspace将确定选择哪个重载,但在您的情况下,您没有传递任何参数,您只是试图确定其地址。

::isspace有效,因为这不是重载函数。

好像是

template <typename T>
void f(T) { }

void g(int) { }
void h() { f(g); } // okay, g is not an overloaded function

void i(int) { }
void i(char) { }
void j() { f(i); } // error, the compiler cannot know whether you want the void(int)
// function, or the void(char) one

评论中告诉您的是正确的,确保其有效的简单方法是不传递 isspace 的地址。完全没有,而是创建一个你自己的调用isspace的函数.出于其他原因,您无论如何都需要这样做,但它也很好地完全避免了这个问题。

关于c++ - remove_if(str.begin(), str.end(),::isspace);::isspace 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29042224/

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