मुझे पता है कि यह आपके जैसा सहायक नहीं हो सकता है, लेकिन मुझे टेम्पलेट त्रुटि संदेशों के खिलाफ सबसे अच्छा टूल मिला है ज्ञान।
एसटीएल की एक अच्छी समझ और इसका उपयोग कैसे करें, आपको पहली जगह में कई त्रुटियों से बचने में मदद मिलेगी। दूसरा, अक्सर त्रुटि संदेश एसटीएल स्रोत में कार्यों का संदर्भ देते हैं - यदि आपके पास कोई अंदाजा है कि एसटीएल कैसे कार्यान्वित किया जाता है, तो यह समझने में बहुत मददगार हो सकता है कि त्रुटि संदेश किस बारे में चल रहा है। अंत में, कंपाइलर निर्माता इस मुद्दे से अवगत हैं और धीरे-धीरे त्रुटि संदेश आउटपुट में सुधार कर रहे हैं, इसलिए आप अपने कंपाइलर के नवीनतम संस्करण से चिपके रहेंगे। यह केवल ले जाया जा सकता
std::vector<std::unique_ptr<int>> foo;
std::vector<std::unique_ptr<int>> bar = foo;
unique_ptr
copyable नहीं है,:
यहाँ एक अस्पष्ट टेम्पलेट त्रुटि का एक अच्छा उदाहरण है। तो किसी अन्य वेक्टर के लिए unique_ptr का वेक्टर असाइन करने का प्रयास करने का अर्थ वेक्टर स्रोत कोड में कहीं भी एक अद्वितीय सूचक की प्रतिलिपि बनाने का प्रयास करेगा। इसलिए त्रुटि उस कोड से उत्पन्न होगी जो आपकी नहीं है और परिणामस्वरूप एक काफी अपारदर्शी त्रुटि संदेश फेंक देती है।
1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xmemory(48): error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'
1> with
1> [
1> _Ty=int
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\memory(2347) : see declaration of 'std::unique_ptr<_Ty>::unique_ptr'
1> with
1> [
1> _Ty=int
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xmemory(197) : see reference to function template instantiation 'void std::_Construct<std::unique_ptr<_Ty>,const std::unique_ptr<_Ty>&>(_Ty1 *,_Ty2)' being compiled
1> with
1> [
1> _Ty=int,
1> _Ty1=std::unique_ptr<int>,
1> _Ty2=const std::unique_ptr<int> &
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xmemory(196) : while compiling class template member function 'void std::allocator<_Ty>::construct(std::unique_ptr<int> *,const _Ty &)'
1> with
1> [
1> _Ty=std::unique_ptr<int>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\vector(421) : see reference to class template instantiation 'std::allocator<_Ty>' being compiled
1> with
1> [
1> _Ty=std::unique_ptr<int>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\vector(481) : see reference to class template instantiation 'std::_Vector_val<_Ty,_Alloc>' being compiled
1> with
1> [
1> _Ty=std::unique_ptr<int>,
1> _Alloc=std::allocator<std::unique_ptr<int>>
1> ]
1> main.cpp(19) : see reference to class template instantiation 'std::vector<_Ty>' being compiled
1> with
1> [
1> _Ty=std::unique_ptr<int>
1> ]
इस के माध्यम से Sifting वहाँ सुराग हैं: आदर्श त्रुटि संदेश
main.cpp(20): cannot construct 'bar' from 'foo': foo's template type is non-copyable
इसके बजाय हो सकता है, VS2010 निम्न त्रुटि देता है। पहला खंड std::unique_ptr<int>
का एक निजी सदस्य पहुंच का संदर्भ देता है। दूसरा खंड, यदि आप स्रोत रेखा पर क्लिक करते हैं, तो unique_ptr
की कॉपी कन्स्ट्रक्टर पर इंगित करता है, जिसे private:
विनिर्देशक के नीचे घोषित किया जाता है। तो अब हम जानते हैं कि हमने एक अद्वितीय_ptr की प्रतिलिपि बनाने की कोशिश की है जिसकी अनुमति नहीं है। अनुभाग 3, 4 और 5 बस बॉयलरप्लेट कोड को इंगित करें - यह सिर्फ शोर है। धारा 6 का कहना है, "क्लास टेम्पलेट इंस्टेंटेशन के संदर्भ देखें" std :: _ वेक्टर_वल < _Ty, _Alloc> 'संकलित किया जा रहा है "। दूसरे शब्दों में, यह त्रुटि वेक्टर के टेम्पलेट कोड में हुई। अंतिम खंड सबसे दिलचस्प है: यह सीधे आपके स्रोत कोड में foo
घोषित लाइन पर इंगित करता है - यह पता लगाया गया है कि आपके स्रोत कोड में त्रुटि से उत्पन्न हुआ है!
तो सुराग को जोड़कर:
- यह foo में निकलती है,
- यह वेक्टर कोड में निकलती है,
- यह एक unique_ptr जिसकी अनुमति नहीं है नकल करने की कोशिश करता।
- निष्कर्ष: वेक्टर ने अपने तत्वों में से एक को कॉपी करने की कोशिश की, जिसकी अनुमति नहीं है।
foo
के लिए समीक्षा कोड और एक प्रतिलिपि बनाने के लिए कुछ भी जांचें।
चूंकि संकलक केवल फू की घोषणा पर इंगित करता है, अगर असाइनमेंट स्रोत कोड में बहुत दूर है तो कुछ शिकार शामिल होंगे। यह स्पष्ट रूप से आदर्श नहीं है, लेकिन मुझे लगता है कि यह दृष्टिकोण आपको अंततः गलतियों को ठीक करने का अधिक मौका देता है। आप यह पहचानना शुरू कर देंगे कि इस प्रकार की त्रुटि डंप का अर्थ है "आपने एक अद्वितीय_पीटीआर कॉपी की है"। दोबारा, मैं इसका बचाव नहीं कर रहा हूं, इसे निश्चित रूप से सुधार की जरूरत है - लेकिन मुझे लगता है कि इन दिनों है एसटीएल के अच्छे ज्ञान के साथ संयुक्त उत्पादन में पर्याप्त जानकारी आपको समस्या को ठीक करने की अनुमति देती है।
कौन सी सी ++ 11 विशेषताएं आपको विशेष रूप से आवश्यक है कि क्लैंग अभी तक नहीं है? –
@ बेनवोइग [क्लैंग वेबसाइट के अनुसार] (http://clang.llvm.org/cxx_status.html) प्रारंभकर्ता सूचियां, सी ++ 0x लैम्ब्डास के लिए नया शब्द, कन्स्ट्रक्टरों को विरासत, सार्वभौमिक चरित्र का नाम शाब्दिक, उपयोगकर्ता परिभाषित अक्षर उपलब्ध नहीं है। क्या क्लैंग वास्तव में टेम्पलेट्स के लिए बेहतर त्रुटि संदेश प्रदान करता है? मैंने कभी कोशिश नहीं की है। – Ali
अवधारणाओं को कुछ भी करने के साथ क्या करना है? जैसा कि आप इंगित करते हैं, वे भाषा में नहीं हैं। –