2009-12-18 20 views
10

मुझे एक संकलन त्रुटि (एमएस वीएस 2008) मिल रही है जिसे मैं समझ में नहीं आता। कई घंटों तक इसके साथ गड़बड़ करने के बाद, यह सब धुंधला है और मुझे लगता है कि कुछ बहुत स्पष्ट (और बहुत बेवकूफ) है जो मुझे याद आ रही है। यहां आवश्यक कोड है:मैं पॉइंटर-टू-सदस्य-फ़ंक्शन कैसे कॉल करूं?

typedef int (C::*PFN)(int); 

struct MAP_ENTRY 
    { 
    int id; 
    PFN pfn; 
    }; 

class C 
    { 
    ... 
    int Dispatch(int, int); 
    MAP_ENTRY *pMap; 
    ... 
    }; 

int C::Dispatch(int id, int val) 
    { 
    for (MAP_ENTRY *p = pMap; p->id != 0; ++p) 
     { 
     if (p->id == id) 
      return p->pfn(val); // <--- error here 
     } 
    return 0; 
    } 

कंपाइलर तीर पर दावा करता है कि "शब्द 1 तर्क लेने वाले फ़ंक्शन का मूल्यांकन नहीं करता है"। क्यों नहीं? पीएफएन एक समारोह के रूप में एक तर्क के रूप में प्रोटोटाइप किया जाता है, और MAP_ENTRY.pfn एक पीएफएन है। मुझे यहां क्या समझ नहीं आ रहा है?

+0

सी वाक्यविन्यास जंगली है, इसलिए उत्तर के रूप में नहीं जोड़ना चाहिए, यह "वापसी (* (पी-> पीएफएन)) (वैल) नहीं होना चाहिए;"? - –

+0

नहीं, जो त्रुटि को उत्पन्न करता है "* प्रकार सी :: पीएफएन के संचालन पर अवैध"। – chrisd

+0

संभावित डुप्लिकेट [कॉलिंग सी ++ क्लास विधियों को फ़ंक्शन पॉइंटर के माध्यम से कॉल करना] (http://stackoverflow.com/questions/1485983/calling-c-class-methods-via-a- कार्यक्षमता- सूचक) –

उत्तर

17

p->pfn को बदलें सूचक-टू-सदस्य-समारोह प्रकार का एक सूचक है। इस तरह के पॉइंटर के माध्यम से फ़ंक्शन को कॉल करने के लिए आपको ऑपरेटर ->* या ऑपरेटर .* का उपयोग करने की आवश्यकता है और बाएं ऑपरेंड के रूप में C प्रकार की ऑब्जेक्ट की आपूर्ति करें। तुमने नहीं किया

मैं नहीं जानता कि किस प्रकार C की वस्तु माना जाता है यहां इस्तेमाल करने के लिए किया जा - केवल आप जानते हैं - लेकिन अपने उदाहरण में यह *this हो सकता है। उस मामले में फोन के रूप में

(this->*p->pfn)(val) 

इस प्रकार आदेश यह थोड़ा कम जटिल लग रही बनाने के लिए लग सकता है, आप एक मध्यवर्ती चर

PFN pfn = p->pfn; 
(this->*pfn)(val); 
+0

धन्यवाद। अब मेरे पास केवल सुधार नहीं है, मैं समझता हूं क्यों। – chrisd

8

प्रयास करें

return (this->*p->pfn)(val); 
+0

हाँ !! बस। बहुत बहुत धन्यवाद। आप लोग अविश्वसनीय हैं। मैं घंटों के लिए इस के साथ खराब हो गया और जवाब 10 मिनट से कम हो गया। – chrisd

-1

p-> PFN एक समारोह सूचक है। इसे कार्य करने के लिए आपको * का उपयोग करने की आवश्यकता है।

(*(p->pfn))(val) 
0

खुद पर एक एहसान करो और boost::function का उपयोग (और बढ़ा लागू कर सकते हैं :: भी बांधो!)

+9

"मेरे साइकिल पर यह खरोंच कहां से आती है?" - "अपने आप को एक पक्ष करो - एक विमान खरीदें" –

0

यह आपके प्रश्न का उत्तर नहीं दे रहा है, लेकिन इसके बजाय boost :: function और boost :: bind का उपयोग करने पर विचार करें। यह आपके कोडबेस में एक बहुत बड़ी निर्भरता पेश करता है, लेकिन यह बड़ी परियोजनाओं के लिए इसके लायक है।

1

बस अपने खुद के अनुभव के साथ में झंकार के लिए, मैं इस बयान की वजह से ग्राम में एक त्रुटि ++ का सामना करना पड़ा:

(this -> *stateHandler)() ; 

कहाँ stateHandler वर्ग के एक शून्य सदस्य समारोह द्वारा * संदर्भित करने के लिए एक सूचक है इस। समस्या तीर ऑपरेटर के बीच की जगहों के कारण हुई थी। निम्नलिखित स्निपेट ठीक संकलित:

(this->*stateHandler)() ; 

मैं जी का उपयोग कर रहा ++ (जीसीसी) 4.4.2 20,090,825 (प्री-रिलीज़)। FWIW।

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