2011-09-21 22 views
9

समारोह घोषणा:सी ++ कंपाइलर त्रुटि का कारण क्या है: कक्षा या गणना के प्रकार का तर्क होना चाहिए?


template <typename T> 
Point<T>* operator +(Point<T> const * const point, Vector<T> const * const vector); 

यह एक समय हो गया है के बाद से मैं सी का उपयोग किया है ++ तो शायद मैं वास्तव में कुछ बेवकूफ कर रहा हूँ। मुझे बताएं।

इसके अलावा, नहीं, मैं नामस्थान std का उपयोग नहीं कर रहा हूं।

उत्तर

8

भाषा स्तर पर आप जो भी गलत कर रहे हैं वह पॉइंटर्स के लिए ऑपरेटरों को अधिभारित कर रहा है। ओवरलोडेड ऑपरेटर का कम से कम एक तर्क उपयोगकर्ता द्वारा परिभाषित प्रकार का होना चाहिए, या एक संदर्भ होना चाहिए।

लेकिन आप यह भी एक और स्तर पर गलत कर रहे हैं। आप एक सूचक लौट रहे हैं, जिसका अर्थ है कि आपको ऑपरेटर में गतिशील रूप से कुछ स्टोरेज आवंटित करने की आवश्यकता होगी। खैर, उस भंडारण का मालिक कौन है? इसे कौन छोड़ देगा?

तुम बस संदर्भ की तरह कुछ लेने के लिए और मूल्य के आधार पर लौटना चाहिए,:

template <typename T> 
Point<T> operator +(Point<T> const& point, Vector<T> const& vector) { 
    return Point<T>(point.x + vector.x, point.y + vector.y); 
} 
+0

एक संकेतक लौटने के कारणों में से एक यह है कि मैं यह नहीं समझ सकता कि मूल्य से कैसे वापसी करें। मुझे यह प्वाइंट कहां से मिलेगा? मैं एक नया() एक नहीं बना सकता और इसे इस तरह वापस कर सकता हूं। –

+0

@ डौग: मैंने सामान्य प्वाइंट और वेक्टर कक्षाओं पर विचार करते हुए एक उदाहरण जोड़ा। यदि आप जावा से आते हैं, तो आपको सीखने की पहली चीज़ यह है कि 'नया' बहुत बार उपयोग किया जाना है। –

+0

इस तरह के आवंटन में क्या प्रकार है? क्या यह किसी भी तरह से कॉलिंग समारोह के साथ scoped है? –

4

आप मौलिक प्रकारों के लिए ऑपरेटरों को अधिभारित नहीं कर सकते हैं, आपके मामले में दोनों तर्क पॉइंटर्स हैं। क्या आप इसके बजाय संदर्भ चाहते थे?

+0

तो भले ही वह कुछ विशेष प्रकार के लिए सूचक है, मैं अभी भी यह ओवरलोड नहीं कर सकते? –

+0

@DougTreadwell पॉइंटर होना मुश्किल होगा जो किसी विशेष प्रकार को इंगित नहीं करता है? ;) – quasiverse

+0

मेरा मतलब था, उपयोगकर्ता परिभाषित प्रकार को इंगित करता है। लेकिन मुझे लगता है कि संकलक यह नहीं देखता कि यह क्या इंगित करता है, बस यह क्या है? –

4

जब आप किसी ऑपरेटर को परिभाषित करते हैं, तो कम से कम एक तर्क उपयोगकर्ता-परिभाषित वर्ग या गणना प्रकार (या उनमें से किसी एक का संदर्भ होना चाहिए) होना चाहिए। पॉइंटर्स उनमें से किसी के रूप में योग्य नहीं हैं। आपको संदर्भ तर्कों का उपयोग करना चाहिए, और एक अयोग्य प्वाइंट < टी > वापस करना चाहिए।

+0

मैं एक अयोग्य प्वाइंट कैसे वापस करूँगा? –

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