Почему мой собственный класс выходного потока не работает?

Возможный дубликат:
std :: endl имеет неизвестный тип при перегрузке оператора ‹<

#include <iostream>

using namespace std;

struct OutputStream
{
    template<class T>
    OutputStream& operator <<(const T& obj)
    {
        cout << obj;

        return *this;
    }
};

OutputStream os;

int main()
{    
    os << 3.14159 << endl; // Compilation Failure!
}

Компилятор VC ++ 2012 жалуется:

ошибка C2676: двоичный '‹<': 'OutputStream' не определяет этот оператор или преобразование в тип, приемлемый для предопределенного оператора


person xmllmx    schedule 05.02.2013    source источник
comment
Вы не определили конец   -  person Simon G.    schedule 06.02.2013
comment
T не относится к endl?   -  person xmllmx    schedule 06.02.2013
comment
Я думал, что это применимо, но код компилируется без endl. Я просто подожду, пока ответят более умные ребята. :п   -  person Simon G.    schedule 06.02.2013
comment
Ну, раз уж это точный дубликат ... удалить это?   -  person Simon G.    schedule 06.02.2013
comment
Я проголосовал за закрытие этого сообщения.   -  person xmllmx    schedule 06.02.2013


Ответы (1)


Причина в том, что компилятор не может определить тип T, потому что std::endl - это функция шаблон, определенный как

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

В IOStreams это преодолевается путем предоставления соответствующей перегрузки operator<<:

OutputStream& operator <<(std::ostream& ( *pf )(std::ostream&))
{
  cout << pf;
  return *this;
}
person vitaut    schedule 05.02.2013
comment
Хороший ответ! Лаконично и универсально! - person xmllmx; 06.02.2013