मुझे ऐसी समस्या हल करने की आवश्यकता है। एक बेस क्लास और दो विरासत कक्षाएं हैं। बेस क्लास में ऐसी विधि होती है जिसे पैरामीटर के रूप में फ़ंक्शन-पॉइंटर की आवश्यकता होती है। लेकिन ऐसे कार्यों को विरासत कक्षाओं में परिभाषित किया गया है।सदस्य-फ़ंक्शन पॉइंटर्स और विरासत
त्रुटि C2664: 'CBase :: WaitEvent':
class CBase; typedef bool (CBase::*FPredicate)(); class CBase { public: CBase() {} ~CBase() {} protected: //this method waits until 'predicate' is true or until 'timeout' ms. passed //and returns true if 'predicate' is true eventually bool WaitEvent(FPredicate predicate, int timeout) { bool result = false; int time1 = GetTickCount(); int time2; bool isEnd = false; while(!isEnd) { result = isEnd = (this->*predicate)(); time2 = GetTickCount(); if(time2 - time1 > timeout && !isEnd) isEnd = true; } return result; } }; class CChildA : public CBase { protected: bool a1() {/*some work*/} bool a2() {/*some work*/} void a_main() { ... WaitEvent(&CChildA::a1, 100); ... WaitEvent(&CChildA::a2, 100); ... } }; class CChildB : public CBase { protected: bool b1() {/*some work*/} bool b2() {/*some work*/} void b_main() { ... WaitEvent(&CChildB::b1, 100); ... WaitEvent(&CChildB::b2, 100); ... } };
MSVC 2005 संकलक WaitEvent पर एक त्रुटि कॉल देता है 'bool से पैरामीटर 1 परिवर्तित नहीं कर सकते (__thiscall CChildA :: *) (शून्य) 'to' FPredicate '
एक प्रश्न है: मैं इसे काम करने के लिए कोड कैसे बदलूं? क्या WaitEvent कॉल को WaitEvent((FPredicate)(&CChildA::a1), 100)
के रूप में फिर से लिखना सुरक्षित होगा?
इस मामले में संकलक कोई त्रुटि नहीं बताता है लेकिन यह सुरक्षित है? या क्या समस्या हल करने का एक बेहतर तरीका है?
अग्रिम धन्यवाद।
कोई भी मौका आप बूस्ट या std :: tr1 का उपयोग कर सकते हैं? उस स्थिति में आप केवल फ़ंक्शन का उपयोग करेंगे और व्युत्पन्न क्लास में बाइंड() को सदस्य फ़ंक्शन –
stijn
@stijn के साथ उपयोग करें, याद रखें, सी ++ 11 लाइव है और 'बाइंड()' पहले से ही 'std ::' । और यह आमतौर पर -std = C++ 0x का उपयोग करने के लिए फायदेमंद है, क्योंकि कुछ छोटी विशेषताएं, जो रोजमर्रा की प्रोग्रामिंग में मदद करती हैं, पहले ही प्रयोग योग्य हैं। – Griwes
क्या आप आधार वर्ग से व्युत्पन्न कक्षाओं में कॉल करने योग्य कार्य कर सकते हैं? दुर्भाग्यवश, –