2011-12-07 16 views
8

Possible Duplicate:
std::endl is of unknown type when overloading operator<<
Operator overloadingऑपरेटर << एसटीडी के लिए की सी ++ श्रृंखलन :: उपयोग

मैं वर्तमान में एक लकड़हारा वर्ग प्रोग्रामिंग हूँ, लेकिन operator<< विधि एक संकलक त्रुटि होती है की तरह अदालत।

#include <iostream> 
class Logger { 
public: 
    Logger() : m_file(std::cout) {} 

    template <typename T> 
    Logger &operator<<(const T &a) { 
     m_file<<a; 
     return *this; 
    } 

protected: 
    std::ostream& m_file; 
}; 

यह मेरी main.cpp में शामिल है और perfecly काम करता है जब मैं उत्पादन एक स्ट्रिंग शाब्दिक है:: यहाँ वर्ग के एक कम से कम संस्करण, फ़ाइल "logger.h" में है

log << "hi"; 

हालांकि, निम्नलिखित संकलित नहीं होगा।

#include "logger.h" 
int main() { 
    Logger log; 

    log << std::endl; 
} 

जी ++ संकलक रिपोर्ट:

src/main.cpp:5: error: no match for 'operator<<' in 'log << std::endl'

उत्तर

11

आपकी समस्या << की चेन, एक भी log << endl भी समस्या का कारण होता है के बारे में नहीं है।

template <class charT, class traits> 
basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os); 

operator<< के अधिभार की basic_ostream में से एक है::

template <class charT, class traits = char_traits<charT> > 
class basic_ostream : virtual public basic_ios<charT,traits> { 
public: 
    basic_ostream<charT,traits>& operator<<(
    basic_ostream<charT,traits>& (*pf)(basic_ostream<charT,traits>&)); 
//... 
}; 

तो टेम्प्लेट पैरामीटर जब std::cout<<std::endl प्रयोग किया जाता है निष्कर्ष निकाला जा सकता है क्योंकि std::endl एक टेम्पलेट समारोह है यह है। हालांकि, जब बाईं तरफ class Logger है, तो संकलन endl के टेम्पलेट पैरामीटर को कम नहीं कर सकता है। स्पष्ट रूप से टेम्प्लेट पैरामीटर कार्यक्रम संकलन करने दे सकते हैं और काम दे:

#include <iostream> 
class Logger 
{ 
public: 
    std::ostream &m_file; 
    Logger(std::ostream &o = std::cout):m_file(o){}; 

    template <typename T> 
    Logger &operator<<(const T &a) { 
     m_file<<a; 
     return *this; 
    } 
}; 

int main() 
{ 
    Logger log; 
    log<<std::endl<char, std::char_traits<char> >; 
    log<<"hi"<<" stackoverflow"<<std::endl<char, std::char_traits<char> >; 
    return 0; 
} 

या आप class Logger में operator<< की एक नई अधिभार जोड़ सकते हैं संकलक std::endl की टेम्प्लेट पैरामीटर अनुमान जाने के लिए:

#include <iostream> 
class Logger 
{ 
public: 
    std::ostream &m_file; 
    Logger(std::ostream &o = std::cout):m_file(o){}; 

    template <typename T> 
    Logger &operator<<(const T &a) { 
     m_file<<a; 
     return *this; 
    } 

    Logger &operator<<(std::ostream& (*pf) (std::ostream&)){ 
     m_file<<pf; 
     return *this; 
    } 
}; 

int main() 
{ 
    Logger log; 
    log<<std::endl; 
    log<<"hi"<<" stackoverflow"<<std::endl; 
    return 0; 
} 

इसके अलावा, अगर आपको आउटपुट को तत्काल फ़्लश करने की आवश्यकता नहीं है, आप endl के बजाय '\ n' का उपयोग कर सकते हैं।

+2

"इसके अलावा, आप उपयोग कर सकते हैं '\ n' के बजाय 'endl' की।" यदि ओपी यह सुनिश्चित करना चाहता है कि आउटपुट बफर फ़्लश किए गए हैं, जैसा कि मैंने [हाल ही में सीखा] (http://stackoverflow.com/q/8311058/440558)। –

+0

ठीक है, मैं इसे अपने उत्तर में जोड़ दूंगा। – fefe

+0

धन्यवाद, यह काम करता है :) – Tuxer

0

त्रुटि std::endl के कारण होती है जो एक कार्य है। उल्लेख करने के लिए:

std::endl is of unknown type when overloading operator<<

+0

'std :: cout' एक फ़ंक्शन है? – jalf

+3

मुझे लगता है कि एरिक कहना चाहता था कि 'std :: endl' एक फ़ंक्शन है। –

+0

मुझे लगता है कि आपका मतलब है "' std :: endl' एक फ़ंक्शन टेम्पलेट है "? –

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

  • कोई संबंधित समस्या नहीं^_^