2011-03-19 15 views
7

वापस नहीं मैं निर्माता है, जो काम नहीं कर रहा जैसा कि मैंने उम्मीद थी के साथ एक समस्या है।निर्माता प्रयोग करने योग्य वस्तु

अगर मैं उस तरह मेरी कक्षा प्रारंभ करने का प्रयास करें, यह काम करेंगे और मैं एक प्रयोग करने योग्य वस्तु मिलती है:

vector<float> v; 
MyClass<2> a(v); 

हालांकि, अगर मैं नीचे की तरह एक वर्ग (जो बराबर होना चाहिए) बनाने की कोशिश परिणाम काफी अप्रत्याशित हैं। कार्यक्रम संकलित या चलाने के दौरान कोई त्रुटि संदेश/चेतावनी नहीं है। लेकिन यदि आप इस चर का उपयोग कहीं और करने की कोशिश करते हैं और इसकी विधियों को कॉल करते हैं (उदाहरण के लिए a.do कुछ()), यह क्रैश हो जाएगा।

मैं मुझे सूचित करने के लिए अगर यह प्रयोग किया जाता है निर्माता के अंदर कुछ कोड डाल दिया। यह पता चला कि इस मामले में निर्माता के अंदर कोई कोड वास्तव में निष्पादित नहीं किया गया था।

MyClass<2> a(vector<float>()); 

तो मुझे आश्चर्य है कि यह क्यों हो रहा है? क्या दूसरी घोषणा अवैध है?

संपादित करें: मैं वर्ग के कुछ कोड

template <int x> 
class MyClass { 
public: 
    vector<float> v; 
    MyClass<x>(vector<float> v1) { 
     v = v1; 
    } 

}; 
+0

क्लैस एस के एक ही प्रकार के सार्वजनिक चर है। तो यह सिर्फ चर के लिए तर्क असाइन करेगा। – dominos

+0

MyClass के कुछ कोड पोस्ट करें! – Nawaz

+0

मैंने कक्षा के कुछ कोड पोस्ट किए। यह एक संदर्भ या सूचक नहीं है, सिर्फ एक चर है। – dominos

उत्तर

18
MyClass<2> a(vector<float>()); 

यह एक चर घोषणा नहीं है पोस्ट करेंगे। यह a नाम के एक समारोह है कि एक MyClass<2> ऑब्जेक्ट और एक तर्क के रूप में एक लेता है की घोषणा है "एक समारोह है कि कोई तर्क एक vector<float> रिटर्न लेता है और करने के लिए सूचक।" भ्रामक? हाँ। इसे "सबसे परेशान पार्स" के रूप में जाना जाता है।

MyClass<2> a((vector<float>())); 
      ^   ^

या, आप प्रतिलिपि आरंभीकरण उपयोग कर सकते हैं:

आप अतिरिक्त कोष्ठकों जरूरत

MyClass<2> a = MyClass<2>(vector<float>()); 

या, के बाद से अपने निर्माता नहीं explicit है, तो आप इस्तेमाल कर सकते हैं:

MyClass<2> a = vector<float>(); 

(हालांकि, जब तक आप vector<float> वस्तुओं होने के लिए इसका मतलब यह परोक्ष converti MyClass<N> वस्तुओं के लिए ble, तो आप शायद इस निर्माता explicit बनाना चाहते हैं।)


एक अच्छा संकलक बात की इस तरह के बारे में चेतावनी चाहिए। विजुअल C++ चेतावनी देते हैं:

चेतावनी C4930: 'MyClass<x> a(std::vector<_Ty> (__cdecl *)(void))': नमूने के समारोह नहीं कहा (एक चर परिभाषा इरादा था?)

बजना चेतावनी देते हैं:

चेतावनी: कोष्ठकों के रूप में disambiguated गया एक समारोह घोषणाकर्ता

MyClass<2> a(vector<float>()); 
      ^~~~~~~~~~~~~~~~~ 
+0

क्यों MyClass <2> a ((वेक्टर ()))? क्या यह MyClass <2> ए (वेक्टर ()) जैसा नहीं होना चाहिए? – BlackBear

+0

@ ब्लैकबियर: अतिरिक्त कोष्ठक के साथ, यह वैध फ़ंक्शन घोषणा नहीं है, इसलिए इसे प्रत्यक्ष प्रारंभकर्ता के साथ एक परिवर्तनीय घोषणा के रूप में पार्स किया जाता है। –

+0

इसे मिला। धन्यवाद :) – BlackBear

संबंधित मुद्दे