为什么 std::getline 的 return 值不能转换为布尔值?
Why is the return value of std::getline not convertible to bool?
当我 运行 来自 Accelerated C++ 的以下示例代码时,我收到错误:
error: value of type 'basic_istream<char, std::__1::char_traits<char> >' is not contextually convertible to 'bool'
while (std::getline(in, line)) {
我在 this 的回答中读到,从 C++11 开始,getline()
returns 对流的引用在使用时转换为 bool
在布尔上下文中。但是,我不明白为什么我的代码中的流不能“上下文转换”为 bool
。你能解释一下并指出正确的版本吗?
#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <cctype>
#include "str_helper.h"
using std::string;
using std::vector;
using std::map;
using std::istream;
// other code here...
map<string, vector<int> >
xref(istream& in, vector<string> find_words(const string&) = split)
{
string line;
int line_number = 0;
map<string, vector<int> > ret;
// read next line
while (std::getline(in, line)) {
++line_number;
// break the input line into words
vector<string> words = find_words(line);
// remember that each word occurs on the current line
for (vector<string>::const_iterator it = words.begin(); it != words.end(); ++it)
ret[*it].push_back(line_number);
}
return ret;
}
您遗漏了 split
的定义,这使得它在您添加之前无法编译。而且我不得不删除 str_helper.h
的私有包含
添加 #include <iostream>
或 istream
似乎确实为我解决了这个问题。
您遇到的问题是因为没有显式包含,不同的编译器和库版本包含 istream
和 getline
的各种部分定义。
您没有将 #include <istream>
添加到您的代码中,因此编译器不知道 istream
是什么,因此它不知道它可以转换为 bool
。
添加 #include <istream>
以解决问题。
当我 运行 来自 Accelerated C++ 的以下示例代码时,我收到错误:
error: value of type 'basic_istream<char, std::__1::char_traits<char> >' is not contextually convertible to 'bool'
while (std::getline(in, line)) {
我在 this 的回答中读到,从 C++11 开始,getline()
returns 对流的引用在使用时转换为 bool
在布尔上下文中。但是,我不明白为什么我的代码中的流不能“上下文转换”为 bool
。你能解释一下并指出正确的版本吗?
#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <cctype>
#include "str_helper.h"
using std::string;
using std::vector;
using std::map;
using std::istream;
// other code here...
map<string, vector<int> >
xref(istream& in, vector<string> find_words(const string&) = split)
{
string line;
int line_number = 0;
map<string, vector<int> > ret;
// read next line
while (std::getline(in, line)) {
++line_number;
// break the input line into words
vector<string> words = find_words(line);
// remember that each word occurs on the current line
for (vector<string>::const_iterator it = words.begin(); it != words.end(); ++it)
ret[*it].push_back(line_number);
}
return ret;
}
您遗漏了 split
的定义,这使得它在您添加之前无法编译。而且我不得不删除 str_helper.h
添加 #include <iostream>
或 istream
似乎确实为我解决了这个问题。
您遇到的问题是因为没有显式包含,不同的编译器和库版本包含 istream
和 getline
的各种部分定义。
您没有将 #include <istream>
添加到您的代码中,因此编译器不知道 istream
是什么,因此它不知道它可以转换为 bool
。
添加 #include <istream>
以解决问题。