2011-06-25 14 views
6

के साथ एक संपूर्ण कक्षा को अग्रेषित करना मैं सोच रहा हूं। मैंने एक समस्या मारा और यहां एक छोटा सा उत्पाद है। अनिवार्य रूप से मैं सबकुछ आगे बढ़ाना चाहता हूं। समस्या यह है कि, पहले < < का उपयोग o<<1 (या o<<SomeUserStruct()) के साथ एक त्रुटि का कारण बन जाएगा। अगर मैं दूसरा शामिल करता हूं तो मुझे अस्पष्ट होने के बारे में त्रुटियां मिलती हैं। क्या कोई तरीका है कि मैं इस कोड को लिख सकता हूं ताकि यह T& का उपयोग करेगा जब यह अन्यथा हो सकता है का उपयोग करता है T?एक ऑपरेटर

#include <iostream> 
struct FowardIt{ 
    template<typename T> FowardIt& operator<<(T&t) { std::cout<<t; return *this; } 
    //template<typename T> FowardIt& operator<<(T t) { std::cout<<t; return *this; } 
}; 

struct SomeUserStruct{}; 

int main() { 
    FowardIt o; 
    o << "Hello"; 
    int i=1; 
    o << i; 
    o << 1; 
    o << SomeUserStruct(); 
} 

उत्तर

10
template<typename T> FowardIt& operator<<(const T&t) 
             //^^^^^ put const here 

पैरामीटर const संदर्भ, के रूप में ऊपर दिखाए गए। temporaries गैर स्थिरांक संदर्भ के लिए बाध्य नहीं किया जा सकता क्योंकि। आप किसी अन्य समारोह को परिभाषित करने की जरूरत नहीं है। बस पैरामीटर const बनाने के लिए, समस्या हल हो जाएगी।

यह भी अगर आप के रूप में समारोह के दायीं ओर करने के लिए const रख कर के रूप में अच्छी समारोह टेम्पलेट const बनाने बेहतर होगा:

template<typename T> 
const FowardIt& operator<<(const T&t) const 
^^^^^      ^^^^^  ^^^^^ 
    |       |   | 
    |       |   put const here as well 
    |       put const here 
    | 
    You've to make the return-type also const 
    since it can't return non-const reference anymore 

यदि आप ऐसा करते हैं, तो आप const वस्तुओं पर इस समारोह कॉल कर सकते हैं साथ ही:

void f(const FowardIt &o)//note: inside the function, o is an const object! 
{ 
    o << 1; 
    o << SomeUserStruct(); 
} 
+0

उत्कृष्ट उत्तर। हालांकि अगर मैं विधि बना देता हूं तो मुझे रिटर्न कॉन्स भी बनाना होगा। जो अनौपचारिक होगा (नियमित धाराओं के लिए)। –

+0

@ एसिडज़ॉम्बी 24: हां। मैंने यह भी जोड़ा! – Nawaz

+0

क्या आपको पता है कि इसके साथ समस्या क्या है? http://www.ideone.com/fWVG4 हेक्स काम करता है ताकि हम जान सकें कि फ़ंक्शंस आगे बढ़ रहे हैं। हालांकि अंतहीन नहीं है। –

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