2012-04-10 22 views
14

मैं विजुअल स्टूडियो 11 बीटा का उपयोग कर रहा हूं और मैं संकलन त्रुटि के बारे में उत्सुक हूं, मैं अपनी कक्षा में std :: function object संग्रहीत कर रहा हूं।क्या सी ++ 11 std :: फ़ंक्शन किसी फ़ंक्शन पॉइंटर के तर्कों की संख्या को सीमित करता है?

typedef std::function<void (int, const char*, int, int, const char*)> MyCallback; 

मेरी कक्षा मैं में,

MyCallback m_callback; 

यह ठीक संकलित करता है। यदि मैं सूची में एक और तर्क जोड़ता हूं तो यह विफल हो जाता है।

typedef std::function<void (int, const char*, int, int, const char*, int)> MyCallback; 

विफलता है:

>c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(535): error C2027: use of undefined type 'std::_Get_function_impl<_Tx>' 
1>   with 
1>   [ 
1>    _Tx=void (int,const char *,int,int,const char *,int) 
1>   ] 
1>   f:\development\projects\applications\my.h(72) : see reference to class template instantiation 'std::function<_Fty>' being compiled 
1>   with 
1>   [ 
1>    _Fty=void (int,const char *,int,int,const char *,int) 
1>   ] 
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(536): error C2504: 'type' : base class undefined 
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(539): error C2027: use of undefined type 'std::_Get_function_impl<_Tx>' 
1>   with 
1>   [ 
1>    _Tx=void (int,const char *,int,int,const char *,int) 
1>   ] 
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(539): error C2146: syntax error : missing ';' before identifier '_Mybase' 
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(539): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 

यह एक गतिशील रूप से जुड़े हुए पुस्तकालय जो एक और आवेदन करने के लिए पारित करने के लिए डेटा तैयारी कर रहा है। मैं निश्चित रूप से डेटा के प्रारूप को फिर से काम कर सकता हूं ताकि इसे कम तर्कों के साथ पारित किया जा सके, लेकिन मैं सोच रहा था कि मुझे यह सीमा क्यों दिखाई दे रही है?

वापस ग शैली समारोह सूचक पर स्विच किया,

typedef void (*MyCallback)(int, const char*, int, int, const char*, int); 

ठीक से काम करने लगता है।

उत्तर

37

यह सीमा विजुअल स्टूडियो में कार्यान्वयन द्वारा निर्धारित की गई है।

std::function के लिए सी ++ विनिर्देश कोई सीमा नहीं रखता है। std::function किसी भी तर्क के साथ काम करने के लिए विविध टेम्पलेट का उपयोग करता है। कार्यान्वयन के आधार पर सीमा हो सकती है, उदाहरण के लिए, टेम्पलेट तत्काल घोंसले की सीमाएं, लेकिन यह बड़ी होनी चाहिए। Spec 1024 को एक न्यूनतम न्यूनतम समर्थित घोंसले की गहराई के रूप में बताता है, और उदाहरण के लिए, एक फ़ंक्शन कॉल में अनुमत तर्कों के लिए 256 न्यूनतम न्यूनतम के रूप में सुझाव देता है।

विजुअल स्टूडियो (वीएस 11 के रूप में) में भिन्न टेम्पलेट्स नहीं हैं। वे उन्हें वीएस 11 में 5 तर्कों का अनुकरण करते हैं, हालांकि आप इसे 10 तक बदल सकते हैं। इसे अपनी परियोजना में _VARIADIC_MAX परिभाषित करके करें। यह संकलन के समय में काफी वृद्धि कर सकते हैं।

अपडेट: वीएस 2012 नवंबर सीटीपी विविध टेम्पलेट्स के लिए समर्थन जोड़ता है, लेकिन मानक लाइब्रेरी को अभी तक उनका उपयोग करने के लिए अपडेट नहीं किया गया है। एक बार यह अपडेट हो जाने के बाद आप std::function के साथ जितना चाहें उतने तर्कों का उपयोग करने में सक्षम होना चाहिए।

+1

सही उत्तर। यह भी देखें [जादू और गोपनीयता] (http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/STL11- मैजिक- रहस्य) एसटीएल द्वारा स्वयं गोइंगनेट 2012 में, वह इसे एक या दो बार उल्लेख करता है। – Xeo

+0

दिलचस्प बात। मुझे याद है कि विविधता वाले टेम्पलेट्स को चीजों के जी ++ पक्ष पर केवल एक मामूली प्रयास किया जा रहा है। –

+0

उत्कृष्ट, जो मेरे प्रश्न का उत्तर देता है, धन्यवाद! – BZor