C++,可以采用 ifstream 或 istringstream 的函数

klk*_*206 19 c++ ifstream istringstream

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

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

下面的代码在第二种情况下给出了一个错误:“错误 C2664: 'do_something: 无法将参数 1 从 'std::basic_istringstream' 转换为 'std::basic_istream'”

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

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);
}
Run Code Online (Sandbox Code Playgroud)

0x4*_*2D2 22

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

std::basic_istringstream<unsigned char> str(std::basic_string<unsigned char>(in));
Run Code Online (Sandbox Code Playgroud)

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

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

std::basic_istringstream<unsigned char> str{std::basic_string<unsigned char>(in)};
Run Code Online (Sandbox Code Playgroud)

  • 不需要所有显式类型转换: `static void string_read(unsigned char* in) { std::basic_ifstream&lt;unsigned char&gt; file("filename"); do_something(文件);std::basic_istringstream&lt;无符号字符&gt; str(in); do_something(str); }` 现在开始就没有令人烦恼的解析了。 (9认同)
  • 我敢说,这是**最**令人烦恼的解析。另外,CLang 通过 `-Wextra` 对此给出了很好的警告。 (2认同)