2012-10-17 13 views
13

के साथ काम नहीं करता है, मैं std::function<double()> लैम्बडा अभिव्यक्ति को असाइन कर रहा हूं। यह टुकड़ा काम करता हैटर्नरी ऑपरेटर लैम्ब्डा फ़ंक्शंस

if(fn_type==exponential) 
    k.*variable = [=,&k](){ return initial*exp(-k.kstep*par); }; 
else 
    k.*variable = [=,&k](){ return initial*pow(k.kstep, par); }; 

जबकि अगर मैं त्रिगुट ऑपरेटर का उपयोग करना चाहते

k.*variable = (fn_type==exponential ? [=,&k](){ return initial*exp(-k.kstep*par); } : [=,&k](){ return initial*pow(k.kstep, par); }); 

मैं निम्नलिखित त्रुटि मिलती है:

error: no match for ternary ‘operator?:’ in <awfully long template error, because this whole thing is in a class defined in a function...> 

यह एक जीसीसी बग है (मैं 4.7 उपयोग कर रहा हूँ .2)? अन्यथा मानक में यह सीमा क्यों है?

उत्तर

18

सशर्त ऑपरेटर के दूसरे और तीसरे ऑपरेटरों के पास एक ही प्रकार होना चाहिए या वहां कुछ सामान्य प्रकार होना चाहिए जिससे वे दोनों परिवर्तित हो सकें जो संकलक समझ सकते हैं। केवल कुछ मुट्ठी भर रूपांतरण हैं जो संकलक विचार करेंगे।

आपके दो लैम्ब्डा अभिव्यक्तियों के अलग-अलग प्रकार हैं, और कोई आम प्रकार नहीं है जिससे वे दोनों परिवर्तित हो सकें (std::function<double()> जैसे उपयोगकर्ता परिभाषित प्रकारों में रूपांतरण, पर विचार नहीं किया जा सकता है क्योंकि संभावित रूप से वैध लक्ष्य प्रकारों की अनंत संख्या है)।

आप सीधे std::function<double()> को ऑपरेंड से प्रत्येक में बदल सकते हैं:

k.*variable = fn_type==exponential 
    ? std::function<double()>([=,&k](){ return initial*exp(-k.kstep*par); }) 
    : std::function<double()>([=,&k](){ return initial*pow(k.kstep, par); }); 

लेकिन वास्तव में, यह if/else साथ क्लीनर है।

+2

उत्तर के लिए +1, "यह/अन्य के साथ क्लीनर" के लिए एक और +1 है। –