2011-12-07 20 views
8

Possible Duplicate:
std::endl is of unknown type when overloading operator<<
Operator overloadingC++ zincirleme :: kullanım

Şu anda bir günlükçü sınıfı programlama yapıyorum ama operator<< yöntemi derleyici hatası neden olur gibi cout. Benim main.cpp dahil ve perfecly zaman çıkış değişmez bir dize çalışır

#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; 
}; 

: Burada dosyası "logger.h" sınıfına bir küçültülmüş versiyonu var

log << "hi"; 

Ancak, Aşağıdaki derleme yapmaz.

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

    log << std::endl; 
} 

gr ++ derleyici raporları:

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

cevap

11

Senin sorunun << zinciri, tek log << endl da soruna neden olur ilgili değil. basic_ostream içinde operator<< yüklenilmesi gibi

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

biri: std::cout<<std::endl kullanıldığında

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>&)); 
//... 
}; 

Yani şablon parametreleri sonucuna varılabilir std::endl bir şablon işlevi olduğu belirtilmektedir. Ancak, sol taraf class Logger olduğunda, derleme endl şablon parametrelerini çıkaramaz. Açıkça şablon programı derlemek sağlayabilirsiniz parametrelerini ve iş vermek:

#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; 
} 

Yoksa derleyici şablon std::endl parametrelerini anlamak izin class Logger içinde operator<< yeni bir aşırı ekleyebilirsiniz: eğer Ayrıca

#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; 
} 

Hemen temizlenecek çıktıya ihtiyacınız yok, endl yerine '\ n' kullanabilirsiniz.

+2

"Ayrıca, '\ n' yerine endl'' arasında kullanabilirsiniz.": Bakınız OP, çıktı arabelleklerinin temizlendiğinden emin olmak istiyorsa, [yakın zamanda öğrendim] (http://stackoverflow.com/q/8311058/440558). –

+0

Doğru, cevabımı ekleyeceğim. – fefe

+0

Teşekkür ederim, işe yarıyor :) – Tuxer