【问题标题】:Convert istream to ifstream?将 istream 转换为 ifstream?
【发布时间】:2014-08-12 22:00:06
【问题描述】:

我正在关注来自http://programmingnotes.freeweq.com/?p=3144 的指定项目的教程。问题是项目规范要求拼写检查器将通过此函数通过main 调用: void spellCh(istream& inf, istream& wordlistfile, ostream& outf) 而本教程使用iftreamofstream。所以当我尝试这个时

void spellCh(istream& inf, ostream& outf)
{    
    ifstream& inf1 = inf;
    ofstream outf1= outf;        
}

这两行都给我一个错误:对类型“ifstream”(又名“basic_ifstream”)的非 const 左值引用不能绑定到不相关类型“istream”(又名“basic_istream”)的值强>

请帮忙,因为我花了一天时间试图弄清楚。什么样的代码可以完成它?

【问题讨论】:

  • 如果您只想使用<< >> 操作符读取/写入流,您可以直接在infoutf 上执行此操作。您不需要将它们转换为函数内部的文件流。
  • 哇,教程中的 C++ 看起来很丑。看起来它是由 C 程序员编写的。但是我在您链接的页面上也没有看到spellCh(istream& inf, istream& wordlistfile, ostream& outf)

标签: c++


【解决方案1】:

std::istreamstd::ostream 分别是 std::ifstreamstd::ofstream 的直接基类。由于称为polymorphism,派生类也被视为其基类,并且可以隐式覆盖到指针或对其的引用(向上转换)。因此,只需将这些实例传递给函数的参数,编译器就会成功地将其转换为它们的基类类型。

对类型 'ifstream' 的非 const 左值引用不能绑定到不相关类型 'istream' 的值

对于基数到派生的转换(向下转换),没有隐式转换。您必须使用static_cast 进行转换,目标类型为std::ifstream&

【讨论】:

  • 为了安全起见不是 dynamic_cast?
  • @NeilKirk 为什么?因为我们知道std::istream 保证是std::ifstream 的基类,所以我们不需要那种类型的演员表。当然应该使用用户定义的类并且当它们不完全确定时这样做,但在这种情况下我们有 100% 的确定性。
  • 我们从问题中的信息中知道吗? OP 是初学者,在写入流的情况下,dynamic_cast 的成本非常低。安全总比后悔好。这就像禁用边界检查,因为我们“确定”我们在边界内。
  • @Nik-Lz 如果动态(目标)类型不是实际的派生类,这只是未定义的行为。
猜你喜欢
  • 2018-03-29
  • 1970-01-01
  • 2019-02-28
  • 2018-09-26
  • 2015-06-13
  • 2021-03-28
  • 2013-01-06
  • 1970-01-01
  • 2016-05-27
相关资源
最近更新 更多