Мой конструктор «Запись» выглядит так:
#include "Record.h" //both these headers #include <iostream>
#include "String.h"
Record :: Record(std::ifstream& is)
{
std :: istream & iss = static_cast<std::istream &>(is);
iss >> ID >> medium >> rating;
getline(iss, title);
if (!iss.good())
throw Record_exception(invalid_data);
}
где ID - это int, medium и title - это пользовательский тип String (не стандартная строка), для которого операторы >>, getline и operator << определены в istream следующим образом </p>
#include "String.h"
ostream& operator << (ostream& os, const String & s)
{
int str_length = s.size();
for (int i = 0; i < str_length ; i++)
os << s[i];
return os;
}
istream& operator >> (istream& is, String& str)
{
char input;
bool string_end = false;
int length = 0;
str.clear();
while (!string_end){
is.get(input);
if (!isspace(input) && is){
length++;
str +=input;
}else if (length || !is)
string_end = true;
}
return is;
}
istream& getline(std::istream& is, String& str)
{
char input;
bool string_end = false;
int length = 0;
str.clear();
while (!string_end){
is.get(input);
if (!isspace(input) && is){
length++;
str +=input;
}else if ((length && is.peek() == '\0') || !is)
string_end = true;
}
return is;
}
я static_casted ifstream istream, потому что я понял, что компилятор не принимает мои "getline" и operator << для String и operator << для строки с ifstream. Я до сих пор не знаю, если это правильный подход, однако </p>
моя ошибка компилятора СЕЙЧАС включает в себя:
"Record.cpp: в конструкторе ord Record :: Record (std :: ifstream &)’:
Record.cpp: 26: ошибка: недопустимый static_cast от типа
‘Std :: basic_ifstream>’ для ввода
«Станд :: IStream &»
я компилирую с флагами "g ++ -c -pedantic -Wall -fno-elide-constructors" на машине linux red_hat