Как я могу использовать std :: endl в пользовательском классе std :: ostream

Я создаю собственный класс ostream, который кратко описан в следующем фрагменте. Я хотел бы иметь возможность использовать std::endl но компилятор меня не пускает. Я не понимаю почему.

#include <iostream>

struct Bar
{
};

template <typename T>
struct Foo
{
};

template <typename T, typename U>
Foo<T>& operator<<(Foo<T>& _foo, U&&)
{
return _foo;
}

int main()
{
Foo<Bar> f;
f << "aa" << std::endl;
}

Ошибка GCC 4.7.1 дает мне это:

main.cpp: 21: 21: ошибка: нет совпадения для оператора ‘<<В операторе<< ((* & f), (* «аа»)) << std :: endl ’main.cpp: 21: 21:
примечание: кандидаты: main.cpp: 13: 9: примечание: шаблон
Foo& оператор<<(Foo&, U&&) main.cpp: 13: 9: примечание: шаблон
не удалось вывести / заменить аргумент: main.cpp: 21: 21: note:
не удалось вывести параметр шаблона «U»

Почему он не может вывести параметр U? Разве это не должно быть typeof(std::endl) ?

1

Решение

поскольку std::endl является

namespace std {
template <class charT, class traits>
basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os);
}

Ваш класс не является производным от basic_ostreamтак что это не может работать.

А также basic_ostream имеет

basic_ostream<charT,traits>& operator<<
(basic_ostream<charT,traits>& (*pf)(basic_ostream<charT,traits>&))

для работ с манипуляторами типа std::endl,

4

Другие решения

Обратите внимание, что редко требуется использовать шаблонный подход, а также нет хорошего использования std::ostream для другой цели, чем удобная инициализация std::ostream с обычаем std::streambuf, Чтобы создать новые источники или цели для чтения или записи, вы извлекаете из std::streambuf, Для записи потока вы обычно перезаписываете std:;streambuf::overflow() а также std::streambuf::sync(),

2

По вопросам рекламы [email protected]