2011-10-17 9 views
6

मैं एक वेक्टर को सॉर्ट करने की कोशिश कर रहा हूं जिसमें एक int और स्ट्रिंग है प्रत्येक तत्व में। यह वेक्टर व्यंजनों नामक कक्षा प्रकार का एक वेक्टर है। उपरोक्त त्रुटि हो रही है, यहाँ मेरी कोड है:त्रुटि C2678: बाइनरी '=': कोई ऑपरेटर नहीं मिला जो 'कॉन्स्ट रेसिपी' (या कोई स्वीकार्य रूपांतरण नहीं है) का बाएं हाथ का ऑपरेशन लेता है

struct Recipe { 
public: 
    string get_cname() const 
    { 
     return chef_name; 
    } 
private: 
    int recipe_id; 
    string chef_name; 

मेरी Menu.cpp में दाखिल

void Menu::show() const { 
    sort(recipes.begin(), recipes.end(), Sort_by_cname()); 
} 

मेरी Menu.h में दाखिल

मेरी Recipe.h फ़ाइल में

#include <vector> 
#include "Recipe.h" 
using namespace std; 

struct Sort_by_cname 
{ 
    bool operator()(const Recipe& a, const Recipe& b) 
    { 
     return a.get_cname() < b.get_cname(); 
    } 
}; 

class Menu { 
public: 
    void show() const; 
private 
    vector<Recipe> recipes; 
}; 

मैं क्या गलत कर रहा हूँ?

+1

हमें लाइन जिस पर आप कि त्रुटि मिलती दिखाएँ ... –

+0

क्या आप वाकई स्ट्रिंग मान और नहीं नुस्खा आईडी पर सॉर्ट करने के लिए चाहते हैं? –

+0

मैंने एक [टैग: सी ++] टैग जोड़ा; यह इस सवाल को अधिक ध्यान देना चाहिए। –

उत्तर

6

Menu::show()const घोषित किया गया है, इसलिए इसके अंदर Menu::recipes को std::vector<Recipe> const के रूप में घोषित किया गया माना जाता है।

जाहिर है, एक std::vector<> छँटाई यह mutates, तो Menu::show() नहीं होना चाहिए const (या Menu::recipesmutable होना चाहिए, लेकिन यह इस मामले में अर्थ की दृष्टि से गलत लगता है)।

+0

वह वास्तव में समझ में आता है और असाइनमेंट कंपाइलर त्रुटि बताता है। –

0

आपने अपनी शो विधि को const के रूप में चिह्नित किया है जो सच नहीं है क्योंकि यह व्यंजनों वेक्टर को बदल रहा है। जब मैं उस कोड को संकलित करता हूं जिसे आपने gnu gcc 4.2.1 के साथ रेखांकित किया है तो त्रुटि कॉन्स्ट क्वालीफायर को अयोग्य घोषित करने के लिए विशिष्ट है, न कि आपके द्वारा पोस्ट की गई त्रुटि।

आप अपने वेक्टर को कीवर्ड mutable के साथ चिह्नित कर सकते हैं, लेकिन मुझे संदेह है कि आप वास्तव में क्या चाहते हैं? वेक्टर म्यूटेबल को चिह्नित करके यह स्थिरता को अनदेखा करता है कि संकलक आमतौर पर वेक्टर के Menu::show() const के भीतर लागू होता है और यह हर बार मेनू :: शो() कहा जाता है। यदि आप वास्तव में वेक्टर का उपयोग करना चाहते हैं, और अन्य लोगों की तरह एक आदेशित सेट का सुझाव नहीं दिया है, तो आप अपने प्रोग्राम को यह जानने के लिए एक गंदे राज्य ध्वज जोड़ सकते हैं जब इसे रिसॉर्ट करना चाहिए या नहीं।

निम्नलिखित कोड मैंने आपको अंतर दिखाने के लिए वेक्टर को बदलने के द्वारा संकलित किया है, लेकिन मैं अभी भी अनुशंसा करता हूं कि आप एक कॉन्स शो विधि से सॉर्ट का उपयोग न करें।

#include <vector> 
#include <string> 

using namespace std; 
struct Recipe { 
public: 
    string get_cname() const 
    { 
    return chef_name; 
    } 
private: 
    int recipe_id; 
    string chef_name; 
}; 

class Menu { 
public: 
    void show() const; 
private: 
    mutable vector<Recipe> recipes; 
}; 

struct Sort_by_cname 
{ 
    bool operator()(const Recipe& a, const Recipe& b) 
    { 
    return a.get_cname() < b.get_cname(); 
    } 
}; 

void Menu::show() const { 
    sort(recipes.begin(), recipes.end(), Sort_by_cname()); 
} 
+0

तुलनित्र __should__ 'const &' (और इसके 'ऑपरेटर()' द्वारा तर्क लेना चाहिए 'स्वयं' होना चाहिए); समस्या यह है कि उनके 'वेक्टर ' 'const' है। – ildjarn

+0

वेक्टर को कॉन्स चिह्नित नहीं किया गया है, इसमें केवल कॉन्स अर्थशास्त्र है क्योंकि विधि शो() को कॉन्स चिह्नित किया गया है। यही कारण है कि मैंने वेक्टर प्रकार को अर्हता प्राप्त करने के लिए उत्परिवर्तनीय कीवर्ड के उपयोग का सुझाव दिया। – James

+0

मैं समझता हूं कि, मेरा मतलब केवल शुद्ध प्रभाव समान है। – ildjarn

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

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