我正在尝试编写一个将信息写入流的函数。我需要能够传递一个stringstream或ostream。我尝试用F(std::ios* out)
声明函数,但后来当我使用<<
操作符写入它时,我得到了这个错误:error: no match for operator<<
。我该如何声明函数呢?
我想你正在寻找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)
{
}
首先,你可能应该传递一个引用给流,否则你将不得不编写(*out)<<
来使插入操作符正确工作(它在流上工作,而不是在指针指向流)。
但更重要的是,std::ios
只是流的基类之一,即包含不依赖于模板形参的IO类成员的基类。
如果你想接收一个通用的输出流,你应该接受对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
)
stringstream
是和ostream
。通用I/O函数通常应该以ostream
或istream
作为引用。
void fun(std::ostream& out);
这将适用于stringstream
和其他ostream
子类,如fstream
。