2017-05-04 76 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添加到该命令。

相关问题