这是Github上非常流行的生物信息学C ++项目:
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?怎么可能?
答案 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起),
如果流没有错误并且已准备好进行I / O操作,则返回
true
。具体来说,返回!fail()
。
在C ++ 11之前,它可以隐式转换为void*
,也可以转换为bool
。
您的编译器似乎无法执行隐式转换,您可以使用!fail()
作为解决方法,例如
bool good = !getline(*m_pReader, line).fail();
答案 1 :(得分:2)
请参阅此question。
用户 Loki Astari 在他的回答中写道:
getline()实际上返回对其使用的流的引用。 当流在布尔上下文中使用时,它将转换为a 可以在布尔上下文中使用的未指定类型(C ++ 03)。在 C ++ 11已更新并转换为bool。
这意味着您可能不使用最新的编译器(C ++ 03甚至更好的C ++ 11)。如果您使用g++
或gcc
,请尝试在命令中添加-std=c++11
。