我最近想找到一种使用 STL 修剪字符串的方法。我看到有人用
remove_if(str.begin(), str.end(), isspace);
我发现
isspace
是 STL 中的一个函数,标题是 <ctype.h>
。我把上面的代码和头文件放在我的函数中,然后它无法通过编译。编译器提示 isspace
。我试试
remove_if(str.begin(), str.end(), std::isspace);
它仍然无法通过编译。
然后我发现另一个人使用
remove_if(str.begin(), str.end(), ::isspace);
我试试这个,它可以通过编译。
我的问题是
::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/