Я работаю свой путь, хотя гр книги Страуструпа ++. Я нахожусь в главе 10, посвященной упражнениям и сталкиваюсь с проблемой. Теперь, насколько я могу судить, я не строго следую книге, основываясь на том, как я видел, как другие отвечают на вопросы. Я думаю, Im сразу после немного большего понимания того, как реализовать код.
Моя общая цель - иметь функцию записи, а не иметь ее в main().
Целью следующей функции является возвращение потока.
ofstream& c_data_file()
{
string oname = "mydata.txt";
ofstream ost {oname};
if (!ost) {
string error = "cannot open " + oname;
throw runtime_error(error);
}
return ost;
}
Этот код приходит с предупреждением от компилятора, и я в том числе, так как она может быть связана с проблемой. Предупреждение:
Reference to stack memory associated with local variable 'ost' returned
ostream& operator<<(ostream& os, const Point& p)
{
return os << "(" << p.x <<"," <<p.y <<")";
}
ofstream& operator<<(ofstream& ost, const Point& p)
{
return ost << "(" << p.x <<"," <<p.y <<")";
}
ostream отлично работает (я использую этот поток еще где). Ofstream не работает, возвращая ошибку:
Non-const lvalue reference to type 'ofstream' (aka 'basic_ofstream') cannot bind to a value of unrelated type 'basic_ostream >'
Ниже приводится остальная часть соответствующего кода:
int main() {
vector<Point> original_points;
ofstream& ost = c_data_file();
for (int i = 0; i<original_points.size(); i++) {
ost << original_points[i] << "\n";
}
ost.close();
}
Я смотрел онлайн весь день, следующий вопрос кажется шкаф:
overloaded operator << on ofstream concatenation problems
Однако, я считаю, что это трудно понять ответ и от того, что я понимаю, это не решает мою проблему.
Благодарим вас за чтение и за любую помощь, которую вы можете дать.
Здесь я включаю следующие изменения, а также свой ответ на iksemyonov с надеждой четко выразить проблему для всех. Редактирование 1: предупреждение было разрешено после рекомендации TBBle. Основная проблема по-прежнему стоит, поскольку ссылка указывает, и iksemyonov предлагает мне использовать ostream вместо потока. Это проблематично. Ostream (по книге) используется для отправки данных в cout, что я делаю (код не присутствует). Я также хочу отправить те же данные в файл (в идеале, как предлагает книга через thestream).
Редактировать 2: после выполнения ссылок и предложений iksemyonov. Несколько комментариев ниже помогли мне выполнить предложения. Так что спасибо всем, кто прокомментировал это.
Первое предупреждение - это то, что вы действительно возвращаете ссылку на временный 'ost', который создается в стеке. Это может привести к сбою, поскольку после того, как функция «ost' выходит за пределы области действия после возвращения функции, она * не гарантируется * существует, поскольку она * может * рано или поздно быть удалена. Таким образом, предупреждение. – iksemyonov
Вы возвращаете ссылку на локальную переменную. Это ** неопределенное поведение ** – PaulMcKenzie