【问题标题】:is it possible to have getline() function accept wistream&是否有可能让 getline() 函数接受 wistream&
【发布时间】:2009-08-21 17:29:43
【问题描述】:

为了澄清,我指的是字符串类中的全局 getline() 函数。

我想做的是有这样的东西:

int main()
{
   wifstream in(L"textfile.txt");
   someFunc(in);
   return 0;
}


void someFunc(const wistream& read)
{
   wstring buff;

   while(getline(read, buff))
   {
      //do some processing here
   }
}

但我得到了一个:

Error   2   error C2664: 'std::getline' : cannot convert parameter 1 from 'const std::wistream' to 'std::basic_istream<_Elem,_Traits> &'

为了修复它,我需要从 const wistream& read 中删除 const。我理解为什么会发生这种情况,但是是否可以将 getline() 配置为接受 wistream 而无需任何转换,还是应该忽略它并删除 const?

【问题讨论】:

    标签: c++ getline


    【解决方案1】:

    它确实接受 wistream,但 getline() 需要一个非常量参数,因为它修改了流。尝试将其更改为:

    ...
    void someFunc(wistream& read)
    ...
    

    【讨论】:

    • 是的,我明白这一点,我已经在问题中指出了这一点
    • 我误读了您的问题,这有点令人困惑。你知道如何解决这个问题,但你似乎误解了它为什么会发生......我想:)我已经修改了我的回复。
    【解决方案2】:

    从流中读取字符会修改流。您不能标记流 const 并期望它正常工作。

    【讨论】:

      【解决方案3】:

      根据经验,

      1. 我总是将函数参数作为const 引用传递
      2. 除非它们是内置类型,在这种情况下它们会被复制(const/non-const 成为风格问题)
      3. 除非它们打算在函数内部进行更改以使更改反映在调用者处,否则它们将通过非const 引用传递
      4. 除非函数应该是可调用的,即使调用者没有要传递的对象,那么它们作为指针传递(#1 和 #3 也适用于此)

      但是,流是该规则的一个明显例外,因为它们必须始终作为非const 引用传递。

      【讨论】:

      • 并不是一个例外——读取时流确实会发生变化。因此,您的案例 3 涵盖了它。
      • 从教学中我了解到大多数新手将此视为例外,因为他们不觉得自己在使用流时会更改流。 (我对双方都开放。)
      猜你喜欢
      • 2011-12-07
      • 1970-01-01
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      • 2016-01-24
      • 2012-01-27
      • 1970-01-01
      相关资源
      最近更新 更多