g ++ string remove_if错误

时间:2011-12-03 01:13:50

标签: c++ string visual-studio-2010 g++ remove-if

以下是代码:

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main()
{
    string word="";
    getline(cin,word);
    word.erase(remove_if(word.begin(), word.end(), isspace), word.end()); 
    word.erase(remove_if(word.begin(), word.end(), ispunct), word.end()); 
    word.erase(remove_if(word.begin(), word.end(), isdigit), word.end());
}

在VS 2010中编译时,它完全正常。用G ++编译它说:

hw4pr3.cpp: In function `int main()':
hw4pr3.cpp:20: error: no matching function for call to `remove_if(__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, <unknown type>)'
hw4pr3.cpp:21: error: no matching function for call to `remove_if(__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, <unknown type>)'
hw4pr3.cpp:22: error: no matching function for call to `remove_if(__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, <unknown type>)'

4 个答案:

答案 0 :(得分:15)

::添加到isspaceispunctisdigit的开头,因为它们有重载,编译器无法决定使用哪个:

word.erase(remove_if(word.begin(), word.end(), ::isspace), word.end()); 
word.erase(remove_if(word.begin(), word.end(), ::ispunct), word.end()); 
word.erase(remove_if(word.begin(), word.end(), ::isdigit), word.end());

答案 1 :(得分:4)

添加#include <cctype>(如果您不是std::isspace,请说abusing namespace std;等。)

始终包含您需要的所有标头,并且不要依赖隐藏的嵌套包含。

您可能还需要消除<locale>中另一个重载的歧义。通过添加显式强制转换来执行此操作:

word.erase(std::remove_if(word.begin(), word.end(),
                          static_cast<int(&)(int)>(std::isspace)),
           word.end());

答案 2 :(得分:2)

对我来说,如果我执行以下任一操作,则使用g ++进行编译:

  • 删除using namespace std;并将string更改为std::string;或
  • isspace更改为::isspace(等等)。

其中任何一个都会导致isspace(等)从主命名空间中获取,而不是被解释为可能意味着std::isspace(等等)。

答案 3 :(得分:1)

问题是std :: isspace(int)将int作为参数,但字符串由char组成。所以你必须编写自己的函数:

  

bool isspace(char c){return c ==''; }

这同样适用于其他两个功能。