2011-12-03 17 views
5

कोड यह रहा। जी के साथ संकलित ++ यह कहते हैं:जी ++ स्ट्रिंग remove_if त्रुटि

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

isspace, ispunct और 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()); 
+0

वैश्विक नामस्थान में सी लाइब्रेरी फ़ंक्शंस को सबसे अच्छी तरह से हटा दिया गया है और विरासत (आपको '') शामिल करना होगा, और सबसे खराब यह केवल एक अजीब कंपाइलर विशिष्टता है जिस पर भरोसा नहीं किया जाना चाहिए। –

+0

@ केरेकस्क: मुझे एहसास नहीं हुआ कि यह बहिष्कृत/हैकी था, टिप के लिए धन्यवाद। – 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

एक स्पष्ट डाली जोड़ कर ऐसा करें मेरे लिए यह जी ++ का उपयोग कर संकलित अगर मैं निम्न में से कोई एक कार्य करें:

  • using namespace std; हटाने औरबदल 0 से std::string; या
  • isspace::isspace (आदि) में बदलें।

इनमें से किसी कारण होगा isspace (आदि) के बजाय संभवतः std::isspace (आदि) अर्थ के रूप में व्याख्या की जा रही है, मुख्य नाम स्थान से लिया जा करने के लिए।

0

समस्या यह है कि std :: isspace (int) पैरामीटर के रूप में एक int लेता है लेकिन एक स्ट्रिंग चार से बना है। तो आपको अपना खुद का कार्य लिखना होगा:

बूल जारीस्थान (चार सी) {वापसी सी == ''; }

वही अन्य दो कार्यों पर लागू होता है।

संबंधित मुद्दे