C Primer Глава 14 Пример readStr не будет компилироваться в Visual Studio 2019

#c

#c

Вопрос:

Пример кода для книги C Primer содержит пример в главе 14 с именем readStr.cpp который имеет ошибки компиляции, когда я использую cl. Я на Windows 10 и установил Visual Studio 2019. Я также пробовал компилировать с использованием g и получал похожие ошибки компиляции. Я также пытался скомпилировать это на своем macbook pro и получаю аналогичную ошибку. Может кто-нибудь, пожалуйста, сообщить мне о причине проблемы и предоставить код, который ее исправляет? Другие примеры из исходного кода книги также приводят к той же ошибке компиляции. Ошибка :

 readStr.cpp(32): error C2440: 'return': cannot convert from 'std::basic_istream<char,std::char_traits<char>>' to 'bool'
readStr.cpp(32): note: No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
 

Код :

 #include "Version_test.h"

#include <algorithm>
using std::for_each;

#include <iostream>
using std::cin; using std::cout; using std::endl; using std::cerr;
using std::istream; using std::ostream;

#include <string>
using std::string; 

#include <vector>
using std::vector;

class PrintString {
public:
    PrintString(ostream amp;o = cout, char c = ' '): 
        os(o), sep(c) { }
    void operator()(const string amp;s) const { os << s << sep; }
private:
    ostream amp;os;   // stream on which to write
    char sep;      // character to print after each output
};

class ReadLine {
public:
#ifdef DELETED_FCNS
    ReadLine() = delete;
#endif 
    ReadLine(istream amp;i) : is(i) { }
    bool operator()(string amp;s) const { return getline(is, s); }
private:
    istream amp;is;
};

int main()
{
    vector<string> vs;
    ReadLine rl(cin);    // object that read lines from cin
    string s;
    while (rl(s))        // store what rl reads into s
        vs.push_back(s);

    cout << "read : " << vs.size() << " elements" << endl;
    PrintString printer;   // uses the defaults; prints to cout 
    printer(s);            // prints s followed by a space on cout

    PrintString errors(cerr, 'n');
    errors(s);             // prints s followed by a newline on cerr

    cerr << "for_each printing to cerr" << endl;
    for_each(vs.begin(), vs.end(), PrintString(cerr, 'n'));
}
 

Комментарии:

1. Сделайте это return !getline(is, s).fail(); . operator bool() выполнен explicit на C 11, но код пытается выполнить неявное преобразование. Просто четко укажите намерение.

2. Какая ошибка, в какой строке?

3. С этим одним изменением ваш пример компилируется для меня без ошибок.

4. Спасибо Танденик — только что понял, что предоставленная вами ссылка указывает мне на ваш код. Большое спасибо!

Ответ №1:

Как вы можете видеть из ссылки, с C 11 оператор bool становится явным. У вас есть два варианта:

  1. Скомпилируйте с предыдущим стандартом (в gcc добавьте флаг -std=c 98 )
  2. Сделайте оператор явным таким образом:

bool operator()(string amp;s) const { return !getline(is, s).fail(); }

Комментарии:

1. Спасибо РикоРико и Танденику. Вы меня кое-чему научили, и я действительно ценю это!