से पैरामीटर 1 को परिवर्तित नहीं कर सकता है अब मैं बूस्ट बाइंड & mem_fn
का उपयोग करने का प्रयास कर रहा हूं। लेकिन ओवरलोडेड-फ़ंक्शन को बांधने में कोई समस्या है। अनुवर्ती कोड की संकलन त्रुटि को हल करने के लिए कैसे करें?'ओवरलोडेड-फ़ंक्शन' से '...'
boost::function< void(IF_MAP::iterator) > bmf = std::mem_fun1< void, IF_MAP, IF_MAP::iterator >(&IF_MAP::erase);
boost::function< void(IF_MAP::iterator) > bmf = boost::mem_fn< void, IF_MAP, IF_MAP::iterator >(&IF_MAP::erase);
मुख्य उद्देश्य का पालन कोड
IF_MAP M;
boost::function< void(IF_MAP::iterator) > bmf = boost::bind(
boost::mem_fn< void, IF_MAP, IF_MAP::iterator >(&IF_MAP::erase),
&M, _1);
M.insert(IF_MAP::value_type(1, 1.f)); M.insert(IF_MAP::value_type(2, 2.f));
bmf(2);
संकलन त्रुटि संदेश इस तरह कर रहे हैं संकलित करने के लिए है ...
त्रुटि C2665: 'को बढ़ावा देने :: mem_fn': से कोई भी 2 अधिभार सभी तर्क प्रकारों को परिवर्तित कर सकते हैं 'boost :: _ mfi :: mf1 boost :: mem_fn :: iterator> (आर (__thiscall std :: map < _Kty, _Ty> :: *) (ए 1))' या 'boost :: _ mfi :: cmf1 boost :: m em_fn :: iterator> (आर (__thiscall std :: नक्शा < _Kty, _Ty> :: *) (A1) स्थिरांक) '
पी.एस. यू जानते हैं, std :: मानचित्र 3 अतिभारित है मिटा सदस्य समारोह
void erase(iterator _Where)
size_type erase(const key_type& _Keyval)
void erase(iterator _First, iterator _Last)
2 समारोह आसानी से आबद्ध किया जा सकता है, लेकिन दूसरों को नहीं।
संपादित
और अधिक विस्तार में मेरे सवाल का वर्णन करने के लिए:
वास्तव में, मैं आस्थगित समारोह कॉल करने के लिए चाहते हैं। जब मैं फ़ंक्शन के रिटर्न कोड को पूरा करता हूं, तो यह समय समाप्त करने का समय है, इसलिए स्थगित फ़ंक्शन को कॉल किया जाना चाहिए।
अब मैं कुछ विरासत कोडों का पुन: उपयोग कर रहा हूं। आजकल, मैं आमतौर पर कोड के इस पैटर्न की तरह दिखता हूं। (वास्तविक कोड अधिक जटिल हैं लेकिन लगभग निम्नानुसार हैं) डुप्लिकेट erase()
कॉल इस फ़ंक्शन में बिखरे हुए हैं।
typedef map< int, float > IF_MAP;
bool DoAndPopOld(IF_MAP& M, int K)
{
IF_MAP::iterator Itr = M.find(K);
if (Itr == M.end()) return false;
if (K < 10)
{
M.erase(Itr); // erase call is here...
return false;
}
if (100 < K)
{
// Do something
M.erase(Itr); // and here...
return true;
}
// Do something
M.erase(Itr); // and also here!
return true;
}
तो, मैं इस तरह कोड ऊपर पुनर्रचना करना चाहते हैं ...
class ScopedOutCaller
{
private:
boost::function< void() > F;
public:
ScopedOutCaller(boost::function< void() > _F) : F(_F) {}
~ScopedOutCaller() { F(); } // deferred function call
};
bool DoAndPopNew(IF_MAP& M, int K)
{
IF_MAP::iterator Itr = M.find(K);
if (Itr == M.end()) return false;
// Make deferred call, so I do not consider calling erase function anymore.
ScopedOutCaller SOC(boost::bind(&IF_MAP::erase), &M, Itr);
if (K < 10)
{
// M.erase(Itr); <-- unnecessary
return false;
}
if (100 < K)
{
// Do something
// M.erase(Itr); <-- unnecessary
return true;
}
// Do something
// M.erase(Itr); <-- unnecessary
return true;
}
लेकिन, जैसा कि मैंने पूछा ... संकलन त्रुटियां हुईं कर रहे हैं। मैं जो करना चाहता हूं उससे लंबा और छोटा यह है कि फ़ंक्शन कॉल को कैसे रोकें। कृपया मुझे स्थगित कॉल करने का तरीका बताएं। धन्यवाद।
मैं सवाल है, जहां यह है में अपने "जवाब" से जानकारी ले जाया गया माना जाता है। यदि आपके पास अतिरिक्त जानकारी है, तो कृपया इसे प्रश्न में संपादित करें। यदि आप इसे उत्तर के रूप में पोस्ट करते हैं, तो यह केवल भ्रमित होता है (और अधिक महत्वपूर्ण बात यह है कि लोग उत्तर देने से पहले नहीं देखेंगे) – jalf
ठीक है, क्या आप केवल वीसी की परवाह करते हैं या नहीं? –
@ जॉर्ज मैं आमतौर पर एमएसवीएस का उपयोग करता हूं, लेकिन अगर आपको कोई विचार है, तो कृपया मुझे कुछ बताएं। धन्यवाद। – codevania