#c #stream
#c #поток
Вопрос:
Я пытаюсь написать функцию, которая записывает информацию в поток. Мне нужно иметь возможность передавать его либо в stringstream, либо в ostream. Я попытался объявить функцию с F(std::ios* out)
помощью , но позже, когда я использую <<
оператор для записи в него, я получаю эту ошибку : error: no match for operator<<
. Как я должен объявлять функцию?
Ответ №1:
Я думаю, вы ищете ссылки на c
void F(std::ostreamamp; out)
{
}
сработало бы; Обратите внимание, что это предполагает char
потоки, в противном случае:
template <typename Char/*=char*/, typename Traits/*=std::char_traits<CharT> */>
void F(std::basic_ostream<Char, Traits>amp; os)
{
}
Комментарии:
1. Существует также
Traits
параметр шаблона.2. @K-ballo: должным образом отмечено; теперь, где, я думаю, я видел, что аргументы шаблона по умолчанию могут быть разрешены для функций в c 11?
3. В C 11 разрешены аргументы шаблона по умолчанию, но здесь нет необходимости их использовать, поскольку аргументы всегда должны совпадать с аргументами потока.
4. @sehe : Вот начало .
Ответ №2:
Прежде всего, вам, вероятно, следует передать ссылку на поток, потому что в противном случае вам придется писать (*out)<<
, чтобы заставить оператор вставки работать правильно (он работает с потоками, а не с указателями на потоки).
Но что более важно, std::ios
это всего лишь один из базовых классов потоков, а именно тот, который содержит члены классов ввода-вывода, которые не зависят от параметров шаблона.
Если вы хотите получить общий выходной поток, вы должны принять ссылку на std::ostream
(для char
потоков на основе) или на std::wostream
(для wchar_t
потоков на основе); если вы хотите перейти на общий, вы должны создать свой шаблон функции для char_type
и char_traits
разрешить все варианты std::basic_ostream class
(обратите внимание, однако, что запись символов не зависит от типакод часто совсем не прост, и если он вам не нужен, возможно, он не стоит усилий — лучше использовать стратегию some TCHAR
-like).
Итак, вероятно, вы хотите:
F(std::ostream amp; out)
(для входных потоков это точно то же самое, но с std::istream
/ std::wistream
/ std::basic_istream
)
Ответ №3:
stringstream
является ostream
. Общие функции ввода-вывода обычно должны принимать либо ostream
или istream
в качестве ссылки.
void fun(std::ostreamamp; out);
Это будет работать с обоими stringstream
и другими ostream
подклассами, например fstream
.
Комментарии:
1. Общие функции ввода-вывода должны принимать либо
basic_ostream<>
илиbasic_istream<>
в качестве ссылки, вместо ограничения типов символов и признаков потока.2. @ildjarn: с другой стороны, если вам нужно написать какой
char_type
-либо независимый от строки ввод-вывод, он быстро превращается в беспорядок и может не стоить затраченных усилий (TCHAR
подобные альтернативы могут быть проще реализованы).