#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 становится явным. У вас есть два варианта:
- Скомпилируйте с предыдущим стандартом (в gcc добавьте флаг
-std=c 98
) - Сделайте оператор явным таким образом:
bool operator()(string amp;s) const { return !getline(is, s).fail(); }
Комментарии:
1. Спасибо РикоРико и Танденику. Вы меня кое-чему научили, и я действительно ценю это!