2013-05-03 20 views
7

मेरे पास कक्षा पॉइंटर्स std::vector<Square*> listSquares का वेक्टर है। मैं कक्षा के गुणों में से एक के रूप में इसे कुंजी के रूप में सॉर्ट करना चाहता हूं। यह मैंstd :: sort() क्लास पॉइंटर्स के वेक्टर पर

bool compById(Square* a, Square* b) 
{ 
    return a->getId() < b->getId(); 
} 

std::sort(listSquares.begin(), listSquares.end(), compById) 

क्या कर रहा है, लेकिन संकलक का कहना है: त्रुटि: 'के लिए तरह (std :: वेक्टर :: iterator कॉल के लिए कोई मिलता-जुलता समारोह, std :: वेक्टर :: iterator, < अनसुलझे अतिभारित फ़ंक्शन प्रकार >) '

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

+6

आप सी ++ 11 उपयोग कर सकते हैं, तो आप इस एक लैम्ब्डा बनाना चाहिए) {वापसी एक-> getId() < b-> getId;}) '। – leftaroundabout

+2

सुनिश्चित करें कि आप वास्तव में पॉइंटर्स चाहते हैं न केवल ऑब्जेक्ट्स भी। – chris

+0

मैं सी ++ 11 का उपयोग नहीं कर सकता। @ क्रिसिस मुझे यकीन है कि मैं पॉइंटर्स का उपयोग करना चाहता हूं। – qutab

उत्तर

12

compById का उपयोग std::sort पर पैरामीटर के रूप में करने के लिए यह सदस्य कार्य नहीं होना चाहिए। यह गलत

class Square 
{ 
    bool compById(Square* a, Square* b) 
    { 
     return a->getId() < b->getId(); 
    } 
    ... 
}; 

यह बेहतर है,

class Square 
{ 
    ... 
}; 

bool compById(Square* a, Square* b) 
{ 
    return a->getId() < b->getId(); 
} 
+0

आपको बहुत बहुत धन्यवाद। यह समस्या थी। लेकिन हम इसे सदस्य समारोह के रूप में क्यों घोषित नहीं कर सकते? असल में मैं इसे वर्ग के मुकाबले एक अलग वर्ग में उपयोग कर रहा हूं। – qutab

+2

क्योंकि std :: सॉर्ट कैसे पता करेगा कि किस ऑब्जेक्ट का उपयोग करने के लिए सदस्य फ़ंक्शन कॉल करते हैं? सदस्य कार्यों को केवल वस्तुओं पर ही बुलाया जा सकता है, लेकिन std :: सॉर्ट का कोई संदर्भ नहीं है कि यह निर्धारित करने के लिए कि कौन सी वस्तु होनी चाहिए। संभवतः आप किसी ऑब्जेक्ट के अंदर से std :: sort को कॉल कर रहे हैं, लेकिन आप उस ऑब्जेक्ट को std :: sort पर पास नहीं कर रहे हैं। std :: sort इस बारे में कुछ भी नहीं जानता है कि इसे कहां से बुलाया जा रहा है, यह सब कुछ जानता है कि आप इसे पारित करने वाले तीन पैरामीटर हैं। टेलीपैथी कौशल – john

+3

+1 यह एक स्थिर सदस्य कार्य हो सकता है। एक सामान्य (गैर स्थैतिक) सदस्य फ़ंक्शन एक निहित पहला तर्क लेता है, a.k.a 'this', और इसलिए गैर-सदस्य फ़ंक्शन की तुलना में एक अलग हस्ताक्षर है। – Basilevs

3

आपके द्वारा खोए जाने वाले सबसे महत्वपूर्ण भाग यह है कि तुलना फ़ंक्शन के तर्क const हैं। दूसरा वापसी का प्रकार है। यदि आप फ़ंक्शन घोषित करते समय वापसी प्रकार छोड़ देते हैं, तो संकलक मान लेगा कि यह int लौटाता है जो इस मामले में सही नहीं है।

और निश्चित रूप से तुलनात्मक कार्य को दायरे में होना चाहिए जब आप std::sort फ़ंक्शन को कॉल करते हैं।

+0

भले ही मैं कॉन्स का उपयोग करता हूं, मुझे वही त्रुटि मिलती है। इस मामले में मुझे भी मिलता है, gameplay.cpp: 911: त्रुटि: 'int' स्क्वायर :: getId() 'क्वालिफायर [-fpermissive] – qutab

+1

@qutab को' इस 'तर्क के रूप में' कॉन्स्ट स्क्वायर 'पास करना, आपको बनाना है getId() एक कॉन्स सदस्य समारोह भी है। – richselian

1

आप एक सदस्य समारोह का उपयोग कर सकते हैं। लेकिन आपको इसे एक स्थिर सदस्य समारोह के रूप में परिभाषित करने की आवश्यकता है और इसे कक्षा से कॉल करने के लिए कक्षा से कॉल करें।

फ़ंक्शन घोषणा से पहले static पर ध्यान दें, और Square:: फ़ंक्शन नाम से पहले। `Std :: प्रकार (listSquares.begin(), listSquares.end(), [] (वर्ग * एक, स्क्वायर * ख:

class Square 
{ 
    /*...*/ 
public: 
    static bool compById(const Square* a, const Square* b) 
    { 
     return a->getId() < b->getId(); 
    } 
}; 

main() 
{ 
    /*...*/ 
    std::sort(listSquares.begin(), listSquares.end(), Square::compById); 
} 
संबंधित मुद्दे