2017-05-04 79 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::getline不返回std::string,但是std::basic_istream。對於getline(*m_pReader, line);,它只是返回*m_pReader

std::basic_istream可經由std::basic_ios::operator bool是隱式轉換爲bool(因爲C++ 11),

返回true如果流沒有錯誤,並準備用於I/O操作。具體而言,返回!fail()

C++ 11它可以被隱式轉換爲void*,這可以轉換爲bool太之前。

看起來您的編譯器未能執行隱式轉換,您可以使用!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添加到該命令。

相關問題