2011-06-24 7 views
5

यह परेशान है, मैं इन पैरामीटर/रिटर्न के साथ एक फ़ंक्शन लिख सकता हूं, लेकिन मैं ऐसा करने के लिए ऑपरेटर को परिभाषित क्यों नहीं कर सकता?मैं ऑपरेटर अधिभार में दो ptrs का उपयोग क्यों नहीं कर सकता?

-edit- मैं वास्तव में संदर्भ के लिए << अधिभारित करने की कोशिश कर रहा हूं।

From msdn

// C2803.cpp 
// compile with: /c 
class A{}; 
bool operator< (const A *left, const A *right); // C2803 
// try the following line instead 
// bool operator< (const A& left, const A& right); 

जीसीसी त्रुटि

error: ‘bool operator<(const A*, const A*)’ must have an argument of class or enumerated type 
+0

आपकी वास्तविक स्थिति क्या है जिसके लिए आपको उस तुलना की आवश्यकता है? –

+0

@ केरेक: मेरा कोड ostringstream का उपयोग कर रहा है। अब मुझे एहसास है कि मुझे एक ढेर की जरूरत है और ओ अपडेट करें। मैं संदर्भ बीसी संदर्भों का उपयोग नहीं कर सकता बदल नहीं है। तो मुझे एक पीआरटी चाहिए। मैंने पहले से ही बहुत सारे कोड लिखे हैं और ओ << काम जारी रखने के लिए rhs चाहते हैं। कई rhs vars ptrs के साथ-साथ –

+0

इसके बजाय आप 'o << * rhs' लिख नहीं सकते हैं? –

उत्तर

10

क्योंकि हर उपयोगकर्ता परिभाषित ऑपरेटर अधिभार की जरूरत कम से कम एक उपयोगकर्ता परिभाषित एक पैरामीटर के रूप प्रकार। एक बिंदु उपयोगकर्ता परिभाषित प्रकार नहीं है।

सी ++ 03 मानक, §13.5 [over.oper] p6:

एक ऑपरेटर समारोह या तो एक गैर स्थिर सदस्य समारोह हो या एक गैर सदस्य समारोह हो सकता है और कम से कम एक पैरामीटर जिसका प्रकार एक वर्ग है नहीं होगा, एक वर्ग, एक गणना, या एक गणना के संदर्भ का संदर्भ।

+0

अच्छी तरह से काम करता है, पॉइंटर्स उसमें शामिल किया जा सकता है। लेकिन उन्होंने फैसला नहीं किया। मैं इसके पीछे तर्कसंगत जानना चाहता हूं। यह मेरी जिंदगी को और अधिक कठिन बना रहा है –

+0

एह, वे कैसे हो सकते हैं? दोनों पैरामीटर के लिए पॉइंटर्स होने के लिए यह कैसे काम करेगा? बिल्टिन ऑपरेटर हैं जो बिल्टिन प्रकारों को संभालते हैं, पॉइंटर्स उनमें से एक हैं। – Xeo

+0

AFAIK '<<' वास्तव में 'टी *' के लिए कुछ भी मतलब नहीं है। और यहां तक ​​कि अगर ऐसा होता है तो मैं इसे अधिभारित करना चाहता हूं।ऑपरेटर वास्तव में काम करते हैं, कार्य मैं जो कर सकता हूं वह कर सकता है। -एडिट- मैं अपने प्रश्न –

3

क्योंकि आपको धोखा देने की अनुमति नहीं है।

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

मेरा असली कोड वास्तव में < < है। मैं इसके लिए इसका उपयोग क्यों नहीं कर सकता?

इसी कारण से: पॉइंटर्स सी ++ - मूल प्रकार हैं। वे उपयोगकर्ता परिभाषित प्रकार नहीं हैं। क्या आप पॉइंटर मूल्यों को बाएं-शिफ्ट करने में सक्षम नहीं होना चाहते हैं? ठीक है, जाहिर है आप करते हैं, लेकिन सी ++ आपको नहीं जाने देगा।

आप केवल ऑपरेटरों को ओवरराइड कर सकते हैं जब C++ में उन प्रकारों के साथ ऑपरेटरों के लिए मौजूदा कार्यक्षमता नहीं है (कुछ अपवादों के साथ)। सी ++ में पहले से ही ऑपरेटर < और ऑपरेटर < < पॉइंटर्स के लिए है, इसलिए आपको उनके द्वारा किए जाने वाले कार्यों को बदलने की अनुमति नहीं है।

+1

मुझे नहीं लगता कि आप पॉइंटर्स को वैसे भी बदल सकते हैं! –

+0

शायद यह ओस्ट्रीम ऑपरेटर है ... – Nemo

+0

@ नीमो ... लेकिन "ओस्ट्रीम का <<" चालू है ... –

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