我正在尝试编写一个将信息写入流的函数。我需要能够传递一个字符串流或ostream。我尝试使用F(std::ios* out)
声明函数,但稍后当我使用<<
运算符写入时,我收到此错误:error: no match for operator<<
。我该如何宣布这个功能?
答案 0 :(得分:7)
我认为您正在寻找c++ references
void F(std::ostream& out)
{
}
会做的伎俩;请注意,这将假设char
个流,否则:
template <typename Char/*=char*/, typename Traits/*=std::char_traits<CharT> */>
void F(std::basic_ostream<Char, Traits>& os)
{
}
答案 1 :(得分:2)
stringstream
ostream
。通用I / O函数通常应将ostream
或istream
作为参考。
void fun(std::ostream& out);
这适用于stringstream
和其他ostream
子类,例如fstream
。
答案 2 :(得分:2)
首先,您应该将引用传递给流,否则您将不得不编写(*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
)