【问题标题】:C++, function that can take either ifstream or istringstreamC++,可以采用 ifstream 或 istringstream 的函数
【发布时间】:2020-11-07 14:34:39
【问题描述】:

我有一个函数 do_something 从流中读取无符号字符。

可以从给定文件名的文件创建流。或者可以通过将给定字符串视为数据来创建它。我想在这两种情况下都重用这个函数。

下面的代码在第二种情况下给出了一个错误:“error C2664: 'do_something: cannot convert argument 1 from 'std::basic_istringstream' to 'std::basic_istream'”。 p>

这样做的正确方法是什么?

static void do_something(std::basic_istream<unsigned char>& in)
{
   in.get();
}

static void string_read(unsigned char* in)
{
   std::basic_ifstream<unsigned char> file(std::string("filename"));
   do_something(file);

   std::basic_istringstream<unsigned char> str(std::basic_string<unsigned char>(in));
   do_something(str);
}

【问题讨论】:

    标签: c++ ifstream istringstream


    【解决方案1】:

    您的代码正在经历一种称为令人烦恼的解析的事情。行:

    std::basic_istringstream<unsigned char> str(std::basic_string<unsigned char>(in));
    

    被解释为函数声明。 str 这里是一个函数,它返回一个std::istringstream,并将一个名为instd::string 类型的变量作为其参数。因此,当您将其传递给函数时,会出现明显的类型不匹配。

    要将其更改为变量声明,您可以使用花括号:

    std::basic_istringstream<unsigned char> str{std::basic_string<unsigned char>(in)};
    

    【讨论】:

    • MOST 令人烦恼的解析,我敢说。此外,CLang 使用-Wextra 对此给出了很好的警告。
    • 不需要所有的显式类型转换:static void string_read(unsigned char* in) { std::basic_ifstream&lt;unsigned char&gt; file("filename"); do_something(file); std::basic_istringstream&lt;unsigned char&gt; str(in); do_something(str); } 现在没有令人烦恼的解析了。
    猜你喜欢
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多