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

Ted*_*ddy 3 c++ stl

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

remove_if(str.begin(), str.end(), isspace);
Run Code Online (Sandbox Code Playgroud)

我发现isspace在stl中是一个函数,标题是<ctype.h>.我把上面的代码和头文件放在我的函数中,然后它无法通过编译.编译器正在抱怨一些事情isspace.

我试试

remove_if(str.begin(), str.end(), std::isspace);
Run Code Online (Sandbox Code Playgroud)

它仍然无法通过编译.

然后我发现另一个人使用

remove_if(str.begin(), str.end(), ::isspace);
Run Code Online (Sandbox Code Playgroud)

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

我的问题是

  1. 为什么我不能通过前两种方式传递编译.

  2. 什么是::isspace手段?是否要提及它属于STL或其他什么?我对使用感到困惑::

小智 5

std::isspace是C++中的重载函数,其中声明了模板函数<locale>.允许实现以静默方式包含您不需要的其他标头,并且许多标头都会这样做.他们这样做是因为他们在内部使用这些额外的标题.

通常,传递给的参数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
Run Code Online (Sandbox Code Playgroud)

你在评论中被告知的是正确的,确保它有效的简单方法是不传递地址isspace,而是创建自己调用的函数isspace.出于其他原因,你仍然需要这样做,但它也完全避免了这个问题.