2011-11-21 7 views
8

तो मुझे एक सरणी मिली है (0 - एन), मूल्यों को धारण करना जो मैं चाहता हूं कि std :: इसके सॉर्टिंग के लिए उपयोग करने के लिए सेट करें। सरणी हस्ताक्षरित int लागत [n] है।मैं एक अनुमान के तत्कालता के साथ std :: सेट क्यों नहीं बना सकता, लेकिन मैं इस तरह से निर्मित एक std :: सेट असाइन कर सकता हूं?

मैं इस छंटाई के लिए निम्नलिखित functor उपयोग कर रहा हूँ: समस्या है

struct ProxySorter { 
    ProxySorter(const unsigned* arr) : proxy_array(arr) {} 
    bool operator()(const unsigned& a, const unsigned& b) const { 
    return proxy_array[a] < proxy_array[b]; 
    } 
    const unsigned* proxy_array; 
}; 

तो यहाँ ... जब मैं सेट का निर्माण, यह कानूनी है:

std::set<unsigned, ProxySorter> node_queue = std::set<unsigned, ProxySorter>(ProxySorter(cost)); 

मुझे कोई मिल त्रुटियां, और सब कुछ अपेक्षित के रूप में काम करता है। लेकिन यह हैक और मैला लगता है।

error: request for member erase in node_queue, which is of non-class type std::set<unsigned int, ProxySorter>(ProxySorter)

:

std::set<unsigned, ProxySorter> node_queue(ProxySorter(cost)); 

सिर्फ ProxySorter (लागत) के साथ निर्माण करने के लिए कोशिश कर रहा है कि हर सेट सदस्य कॉल के लिए इस तरह सामान कहा, त्रुटियों की एक गुच्छा का कारण बनता है:

बहरहाल, यह जाहिरा तौर पर गैर-कानूनी है

नियमित निर्माण के साथ समस्या क्या है? असाइनमेंट क्यों काम करता है? यहां क्या अंतर है कि मुझे याद आ रही है? किसी भी मदद की बहुत सराहना की, धन्यवाद।

ओह और प्रश्न के शीर्षक के बारे में खेद है, मुझे सच में यकीन नहीं था कि इसे क्या कहना है।

उत्तर

13

Most-vexing-parse

std::set<unsigned, ProxySorter> node_queue((ProxySorter(cost))); 

वरना यह एक समारोह अपने निर्धारित प्रकार लौटने और प्रकार ProxySortercost नाम की एक बहस लेने की घोषणा के रूप में समझा जाएगा: आप कोष्ठकों का एक और जोड़ी की जरूरत है।

+0

क्यों, क्योंकि अन्यथा इसे फ़ंक्शन घोषणा के रूप में पार्स किया गया है? वाह। –

+0

वाह। खैर मैंने कभी यह नहीं सोचा होगा। –

+0

@ जॉन: हाँ, मेरा छोटा संपादन और लिंक देखें। – Xeo

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

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