我最近想找到一种使用 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/

    10-11 06:22