Разрешить stringstream и outtream в качестве параметра - PullRequest
0 голосов
/ 28 октября 2011

Я пытаюсь написать функцию, которая записывает информацию в поток.Я должен быть в состоянии передать это или поток строки или ostream.Я попытался объявить функцию с помощью F(std::ios* out), но потом, когда я использую оператор << для записи в нее, я получаю эту ошибку: error: no match for operator<<.Как мне объявить функцию?

Ответы [ 3 ]

7 голосов
/ 28 октября 2011

Я думаю, что вы ищете c ++ ссылки

void F(std::ostream& out)
{
}

сделает трюк; Обратите внимание, что это будет принимать char потоков, в противном случае:

template <typename Char/*=char*/, typename Traits/*=std::char_traits<CharT> */>
    void F(std::basic_ostream<Char, Traits>& os)
{
}
2 голосов
/ 28 октября 2011

Прежде всего, вы, вероятно, должны передать ссылку в поток, потому что в противном случае вам придется написать (*out)<<, чтобы оператор вставки работал правильно (он работает на потоках, а не на указатель на потоки).

Но, что более важно, std::ios - это только один из базовых классов потоков, а именно тот, который содержит члены классов ввода-вывода, которые не зависят от параметров шаблона.

Если вы хотите получить общий выходной поток, вы должны принять ссылку на std::ostream (для потоков char) или std::wostream (для потоков wchar_t); если вы хотите использовать универсальный шаблон, вы должны сделать свой шаблон функции для char_type и char_traits, чтобы разрешить все варианты std::basic_ostream class (однако обратите внимание, что написание кода, независимого от типа символа, часто совсем не просто, и если вы не нужно, это может не стоить усилий - лучше использовать какую-то TCHAR -подобную стратегию).

Итак, вероятно, что вы хотите:

F(std::ostream & out)

(для входных потоков это точно так же, но с std::istream / std::wistream / std::basic_istream)

2 голосов
/ 28 октября 2011

stringstream - это и ostream. Общие функции ввода / вывода обычно должны принимать либо ostream, либо istream в качестве ссылки.

void fun(std::ostream& out);

Это будет работать как с stringstream, так и с другими подклассами ostream, такими как fstream.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...