1

我正在尝试从字符串中删除空格。但抛出一个错误。

我的代码做错了哪个参数..感谢您的关注

我的主要功能

#include <algorithm>
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <sstream>
using namespace std;


int main()
{
    string myText;
    myText = readText("file.txt");
    myText.erase(remove_if(myText.begin(), myText.end(), isspace), myText.end());
    cout << myText << endl;

    return 0;
}

以下是我尝试编译时出现的错误。

encrypt.cpp: In function ‘int main()’:
encrypt.cpp:70:70: error: no matching function for call to ‘remove_if(std::basic_string<char>::iterator, std::basic_string<char>::iterator, <unresolved overloaded function type>)’
encrypt.cpp:70:70: note: candidate is:
/usr/include/c++/4.6/bits/stl_algo.h:1131:5: note: template<class _FIter, class _Predicate> _FIter std::remove_if(_FIter, _FIter, _Predicate)
4

2 回答 2

3

您收到此错误是因为有两个带有 name 的函数isspace

  1. locale在标头、命名空间 std中定义:

    template<class charT>
    bool std::isspace(charT ch, const locale& loc);
    
  2. cctype在标头中定义,全局命名空间

    int isspace( int ch );
    

所以,如果你想使用第二个功能,你有两种方法:

  1. 不要使用using namespace std. 我更喜欢它。
  2. 用于::调用函数,定义在全局命名空间中

    remove_if(myText.begin(), myText.end(), ::isspace)
    //                                      ^^
    
于 2013-04-13T08:21:20.300 回答
0

里面有几个详细的解释:

没有函数模板 remove_if 的实例与参数列表匹配

总而言之, isspace 对编译器来说是模棱两可的。我宁愿命令不使用它。

下面的代码适用于 G++ 4.7.2

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

bool isSpace(const char& c)
{
    return !!::isspace(c);
}

int main()
{
    string text("aaa bbb ccc");
    text.erase(remove_if(text.begin(), text.end(), isSpace), text.end());
    cout << text << endl;
    return 0;
}
于 2013-04-13T08:25:57.003 回答