開発環境をVC++2010からVS2015に変更したらエラーが発生しました

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
skn

開発環境をVC++2010からVS2015に変更したらエラーが発生しました

#1

投稿記事 by skn » 9年前

コードの一部を抜粋します。

コード:

ofstream fout;
fout.open("datG.pac", ios::out | ios::binary | ios::trunc);
	
if(fout != 0)
{
	fout.write( t_ArchiveData.c_str(), t_ArchiveData.size() );
	fout.close();//ファイルを閉じる
}
4行目のfout != 0の部分で
エラー C2678 二項演算子 '!=': 型 'std::ofstream' の左オペランドを扱う演算子が見つかりません (または変換できません)
というエラーが出ました。

しかし、このプログラムはVC++2010で開発し正常に動作していたものを、パソコンの新規購入に伴いVS2015に移行しただけで、何もいじっていません。
どなたかご教授ください…。

djann
記事: 27
登録日時: 12年前

Re: 開発環境をVC++2010からVS2015に変更したらエラーが発生しました

#2

投稿記事 by djann » 9年前

そもそもofstreamのオブジェクトを0と比較するという考え方が間違っています。真偽値は真偽値であり、1や0とは概念が違います(実態は別として)。真偽値は出来るだけ、条件式に素のまま入れる使い方をしましょう。(正しいが正しいのなら~という条件・・・というか記述はおかしいですよね?)

また、おすすめ以前に考え方を正しく持った使い方をすれば、今回の問題は解決します。

コード:

std::fstream fs;
if ( fs == true ){}	// 真偽値との比較だけどあまり良くない
if ( fs ){}			// こちらの方がよい

if ( !fs ){}			// 否定はこちらまたは
if ( fs.fail() ){}		// fail()というメンバが用意されているのでそちらで

エラーが起きるようになった経緯としては

1. fstreamには、真偽値への変換演算子が定義されている。故に条件式に使用できる。
2. しかし従来の変換演算子には、汎用的過ぎるという欠点があった。※なのでsafe boolイディオムを利用されていることが多い。
3. VC++ 2013から、C++11で導入された「明示的な型変換演算子」というものに対応し、おそらく標準ライブラリでもそちらが使われるようになった。
4. 明示的な型変換演算子では、従来の「boolだけどintにも変換できるしよくね?」という暗黙の変換挙動が抑制される。

故に0との比較というint(または0だけの特別ルールとして何らかのポインタ型)への暗黙変換が行われなくなり、結果エラーとなったのでしょう。

skn

Re: 開発環境をVC++2010からVS2015に変更したらエラーが発生しました

#3

投稿記事 by skn » 9年前

おっしゃられたとおり、fout != 0の代わりに!foutを使うことで無事コンパイルとおりました。
ありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る