为什么 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 似乎确实为我解决了这个问题。

您遇到的问题是因为没有显式包含,不同的编译器和库版本包含 istreamgetline 的各种部分定义。

您没有将 #include <istream> 添加到您的代码中,因此编译器不知道 istream 是什么,因此它不知道它可以转换为 bool

添加 #include <istream> 以解决问题。