2017-05-04 6 views
3

これはGitHubの上のバイオインフォマティクスのための非常に人気のあるC++プロジェクトです:なぜこのGithubプロジェクトは文字列をboolに変換するのですか?

https://github.com/jts/sga/blob/master/src/Util/ClusterReader.cpp

行がある:

bool good = getline(*m_pReader, line); 

私はこの行をコンパイルすることはできませんし、私はドン」作者がなぜそれをしたのか分かりません。

documentationによれば、getlineはboolではない文字列を返します。確かに、これは私がプロジェクトをコンパイルしようとしている間、私が得るものです:

ClusterReader.cpp: In member function ‘bool 
ClusterReader::readCluster(ClusterRecord&)’: 
ClusterReader.cpp:70:41: error: cannot convert ‘std::basic_istream<char>’ to ‘bool’ in initialization 
bool good = getline(*m_pReader, line); 

はなぜC++コードは、BOOLする文字列を変換するのですか?それはどのように可能でしょうか?

+2

いいえ、 'std :: getline'は元のストリームを返し、エラーがなければストリームのブール型キャストは' true'を返します。どのコンパイラを使用していますか?これを回避したい場合は、 'bool good = getline(* m_pReader、line).good();'に変更することができます。 – paddy

+0

これは、コンパイラのバグ(コンパイラとライブラリのインストールの不一致を含む)を示唆しています。どのコンパイラと設定を使用していますか? –

答えて

3

std::getlinestd::stringですが、std::basic_istreamは返されません。 getline(*m_pReader, line);の場合は、*m_pReaderが返されます。

std::basic_istreamstd::basic_ios::operator bool介しboolに変換暗黙とすることができるストリームにエラーがないとI/O操作のための準備ができている場合、

戻りtrue(C++ 11以降)。具体的には、!fail()を返します。 C++ 11それは暗黙的にあまりにもboolに変換することができvoid*に変換することができる前

コンパイラが暗黙の変換を実行できなかったようですが、回避策として!fail()を使用できます。

bool good = !getline(*m_pReader, line).fail(); 
2

このquestionを参照してください。

ユーザーロキアスタリは彼の答えに書いた:

のgetline()は実際にそれが使用されたストリームの参照を返します。 ストリームがブール値のコンテキストで使用される場合、ブール値のコンテキストで使用される 不特定の型(C++ 03)に変換されます。 C++ 11でこれが更新され、boolに変換されました。

つまり、最新のコンパイラ(C++ 03またはそれ以上のC++ 11)を使用していない可能性があります。 g++またはgccを使用する場合は、-std=c++11をコマンドに追加してみてください。

関連する問題