允许stringstream和outstream作为参数

时间:2011-10-27 21:56:58

标签: c++ stream

我正在尝试编写一个将信息写入流的函数。我需要能够传递一个字符串流或ostream。我尝试使用F(std::ios* out)声明函数,但稍后当我使用<<运算符写入时,我收到此错误:error: no match for operator<<。我该如何宣布这个功能?

3 个答案:

答案 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函数通常应将ostreamistream作为参考。

void fun(std::ostream& out);

这适用于stringstream和其他ostream子类,例如fstream

答案 2 :(得分:2)

首先,您应该将引用传递给流,否则您将不得不编写(*out)<<以使插入运算符正常工作(它适用于流,不在指针到流)。

但更重要的是,std::ios只是流的基类之一,即包含不依赖于模板参数的IO类成员的类。

如果您想要接收通用输出流,则应接受对std::ostream(基于char的流)或std::wostream(基于wchar_t - 的引用流);如果你想要通用,你应该为char_typechar_traits制作你的功能模板以允许std::basic_ostream class的所有变体(但是请注意,编写与字符类型无关的代码通常并不简单在所有情况下,如果你不需要它,可能不值得努力 - 更好地使用一些TCHAR - 就像策略一样。)

所以,可能你想要的是:

F(std::ostream & out)

(对于输入流,它完全相同,但使用std::istream / std::wistream / std::basic_istream