0

明確にするために、文字列クラスのグローバルな 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 を削除する必要があります。なぜこれが起こっているのか理解していますが、変換せずに代わりに wistream を受け入れるように getline() を構成することは可能ですか、それとも無視して const を削除する必要がありますか?

4

3 に答える 3

4

これは wistream を受け入れますが、getline() はストリームを変更するため、非 const 引数を要求します。次のように変更してみてください。

...
void someFunc(wistream& read)
...
于 2009-08-21T17:39:21.567 に答える
3

ストリームから文字を読み取ると、ストリームが変更されます。ストリーム const をマークして、それが正しく機能することを期待することはできません。

于 2009-08-21T17:41:26.273 に答える
0

経験則として、

  1. 私は常に関数パラメータをconst参照として渡します
  2. 組み込み型でない限り、その場合はコピーされます (そしてconst/non-constはスタイルの問題になります)
  3. 変更が呼び出し元に反映されるように関数内で変更することを意図していない限り、それらは非const参照で渡されます
  4. 呼び出し元が渡すオブジェクトを持っていなくても、関数が呼び出し可能でなければならない場合を除き、それらはポインターとして渡されます (#1 と #3 もここに適用されます)。

constただし、ストリームは常に非参照として渡さなければならないため、この規則の注目すべき例外です。

于 2009-08-21T17:47:48.757 に答える