2011-12-03 33 views
5

下面的代碼:克++字符串的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>)' 

回答

13

添加::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()); 
+0

充其量,全局名稱空間中的C庫函數至少已被棄用且遺留下來(您將不得不包含''),最壞的情況是它只是一個不應該依賴的奇怪的編譯器特性。 –

+0

@KerrekSB:我沒有意識到它已被棄用/哈克,謝謝你的提示。 – AusCBloke

3

添加#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

通過增加一個明確的轉換做到這一點對我來說,如果我執行以下任一操作,使用g ++編譯:

  • 刪除using namespace std;和更改stringstd::string;或
  • 更改isspace::isspace(等)。

無論是哪種會引起isspace(等)以從主命名空間取出,而不是被解釋爲可能意味着std::isspace(等),。

0

問題是,std :: isspace(int)將int作爲參數,但字符串由char組成。所以你必須寫下你自己的函數:

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

這同樣適用於其他兩個功能。