9

这是代码:

#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

4 回答 4

22

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

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());
于 2011-12-03T01:20:01.417 回答
4

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

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

您可能还必须从<locale>. 通过添加显式强制转换来做到这一点:

word.erase(std::remove_if(word.begin(), word.end(),
                          static_cast<int(&)(int)>(std::isspace)),
           word.end());
于 2011-12-03T01:18:57.517 回答
2

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

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

这些中的任何一个都将导致isspace(等)从主命名空间中获取,而不是被解释为可能的含义std::isspace(等)。

于 2011-12-03T01:20:56.827 回答
1

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

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

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

于 2011-12-03T01:25:16.120 回答