2011-12-03 26 views
5

Dưới đây là các mã:g ++ lỗi chuỗi 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()); 
} 

Khi biên soạn trong VS 2010, nó hoạt động hoàn toàn tốt đẹp. Biên soạn với G ++ nó nói:

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>)' 

Trả lời

13

Thêm :: đến đầu isspace, ispunctisdigit, vì họ có quá tải mà trình biên dịch không thể quyết định mà trên đó để sử dụng:

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

Tốt nhất là có chức năng thư viện C trong không gian tên chung không được dùng nữa và kế thừa (bạn sẽ phải bao gồm ''), và tệ nhất là tính đặc thù của trình biên dịch lẻ không nên dựa vào. –

+0

@KerrekSB: Tôi đã không nhận ra nó đã không được chấp nhận/hacky, cảm ơn cho tip. – AusCBloke

3

Thêm #include <cctype> (và nói std::isspace vv nếu bạn không phải là abusing namespace std;).

Luôn bao gồm tất cả các tiêu đề bạn cần và không dựa vào các tạp chất lồng nhau ẩn.

Bạn cũng có thể phải làm sai lệch sự quá tải từ mức quá tải khác trong số <locale>. Làm điều này bằng cách thêm một diễn viên rõ ràng:

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

Đối với tôi, nó biên dịch bằng g ++ nếu tôi thực hiện một trong các thao tác sau:

  • xóa using namespace std; và thay đổi string đến std::string; hoặc
  • thay đổi isspace thành ::isspace (v.v ...).

Hoặc trong số này sẽ gây isspace (vv) được lấy từ namespace chính, thay vì được hiểu là có thể có nghĩa là std::isspace (vv).

0

Vấn đề là std :: isspace (int) lấy int làm tham số nhưng một chuỗi được tạo thành từ char. Vì vậy, bạn phải viết chức năng của riêng bạn là:

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

Điều tương tự cũng áp dụng cho hai chức năng còn lại.

Các vấn đề liên quan