Я создаю собственный класс 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)
?
поскольку 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
,
Обратите внимание, что редко требуется использовать шаблонный подход, а также нет хорошего использования std::ostream
для другой цели, чем удобная инициализация std::ostream
с обычаем std::streambuf
, Чтобы создать новые источники или цели для чтения или записи, вы извлекаете из std::streambuf
, Для записи потока вы обычно перезаписываете std:;streambuf::overflow()
а также std::streambuf::sync()
,