Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
DWand
13 / 13 / 1
Регистрация: 23.04.2011
Сообщений: 99
#1

STL. Не работает вывод через << в поток когда использую итераторы :( - C++

07.12.2011, 20:25. Просмотров 284. Ответов 2
Метки нет (Все метки)

Вроде бы ничего сложного, но почему-то работать не хочет. Никак не могу понять почему (
Ругается, когда пишу
C++
1
2
3
4
void main() {
    ToursManager tm;
    cout << tm;
}
А вот сам код заголовника с классом:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include <fstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <iterator>
#include <algorithm>
 
struct TourEntry {
public:
    std::string TourName;               // название тура
    std::string ClientSurname;          // фамилия клиента
    unsigned short DaysCount;           // количество дней
    double DayPriceRub;                 // цена за день в рублях
    double Fare;                        // цена за проезд
    double TravelCost;                  // общая стоимость поездки в рублях
    double CurrencyCourse;              // курс валюты
    double CurrencyCount;               // количество валюты
 
    TourEntry() :
        TourName(),
        ClientSurname(),
        DaysCount(0),
        DayPriceRub(0),
        Fare(0),
        TravelCost(0),
        CurrencyCourse(0),
        CurrencyCount(0)
    {}
 
    inline bool LessFare(const TourEntry& teL, const TourEntry& teR) {
        return teL.Fare < teR.Fare;
    }
 
    inline bool LessDaysCount(const TourEntry& teL, const TourEntry& teR) {
        return teL.DaysCount < teR.DaysCount;
    }
 
    friend std::istream &operator>>(std::istream &stream, TourEntry &te) {
        stream >> te.TourName;
        stream >> te.ClientSurname;
        stream >> te.DaysCount;
        stream >> te.DayPriceRub;
        stream >> te.Fare;
        stream >> te.TravelCost;
        stream >> te.CurrencyCourse;
        stream >> te.CurrencyCount;
        return stream;
    }
 
    friend std::ostream &operator<<(std::ostream &stream, const TourEntry &te) {
        stream << "Name \"" << te.TourName << "\"" << std::endl;
        stream << "Client " << te.ClientSurname << std::endl;
        stream << "Number of days: " << te.DaysCount << std::endl;
        stream << "Cost: ----------------------------------" << std::endl;
        stream << "Daily payment:   " << te.DayPriceRub << " RUB" << std::endl;
        stream << "Fare:            " << te.Fare << "RUB" << std::endl;
        stream << "Total price:     " << te.TravelCost << std::endl;
        stream << "Currency course: " << te.CurrencyCourse << std::endl;
        stream << "Currency count:  " << te.CurrencyCount << std::endl;
        return stream;
    }
};
 
 
 
 
class ToursManager {
private:
    std::vector<TourEntry> _tours;
    std::queue<TourEntry> _history;
 
public:
    ToursManager(){}
    ~ToursManager(){}
 
public:
    bool AddDataFromFile(std::string fileName) {
        std::fstream file(fileName, std::ios::in);
        if (!file.is_open()) return false;
 
        std::istream_iterator<TourEntry> reader(file);
        std::istream_iterator<TourEntry> readerEOF;
        copy (reader, readerEOF, _tours);
 
        file.close();
        return true;
    }
 
    unsigned int GetSize() const {
        return (unsigned int)_tours.size();
    }
 
    TourEntry FindByTourName(std::string tourName) const {
        std::vector<TourEntry>::const_iterator finder;
        finder = std::find_if(_tours.begin(), _tours.end(),
                             [tourName](const TourEntry& te){ 
                             return te.TourName == tourName;}
        );
        if (finder != _tours.end()) {
            copy(finder,finder,_history.back());
            return *finder;
        } else {
            return TourEntry();
        }
    }
 
    friend std::ostream &operator<<(std::ostream &stream, const ToursManager &tm) {
        std::for_each(tm._tours.begin(), tm._tours.end(), [&stream](TourEntry te) {
            stream << te;
            stream << std::endl;
        });
        return stream;
    }
};
MS VS 2010 выдает 32 ошибки (
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.12.2011, 20:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос STL. Не работает вывод через << в поток когда использую итераторы :( (C++):

STL. Итераторы и последовательные контейнеры - C++
Немогу решить эти задачки: 1 Написать экземпляр класса queue на основе элементов типа string. 2.Написаты программу, которая использует...

Найти элемент в контейнере priority_queue, используя STL вские итераторы и алгоритмы - C++
Здравствуйте, задача описана в навание темы. Можно перебрать в цикле все элементы очереди, сравнивая с нужным, но требуется именно с...

STL и поток - C++
Есть вектор, объявленный в основной программе, состоящий из ссылок на компоненты типа TImage и TCheckBox: struct mass { TImage *img; ...

Где и когда применяются итераторы? - C#
Форумчане объясните пожалуйста где и когда применяются итераторы? принцип работы понятен перебор данных одного типа но можно пример из жизни

Зависает форма, когда использую while или for - C#
Что делать если при использование for или while зависает форма ? вот код: private void button3_Click(object sender, EventArgs e) ...

Ошибка когда использую фун-ю split() - PHP
&lt;? print&lt;&lt;&lt;HERE &lt;textarea rows='10' cols='50' name=&quot;text&quot;&gt;&lt;/textarea&gt; &lt;br&gt; &lt;input type='submit' name='go'&gt; HERE; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
07.12.2011, 21:02 #2
Про новые лямбды ничего не скажу. Мне пока что бустовые бинды ближе. Тупо закоментарил их.
Ошибок стало меньше.

C++
1
2
3
// line 79
std::fstream file(fileName, std::ios::in); // error
std::fstream file(fileName.c_str(), std::ios::in); // ok
C++
1
2
3
//line 83
copy (reader, readerEOF, _tours); // error
copy (reader, readerEOF, std::back_inserter(_tours)); // ok
line 101:
C++
1
copy(finder,finder,_history.back());
что тут? добавление в конец очереди? если да, то обычный _hostory.push(*finder). + это константная ф-ия. поэтому либо убрать константность ф-ии, либо сделать _history mutable.
1
DWand
13 / 13 / 1
Регистрация: 23.04.2011
Сообщений: 99
07.12.2011, 21:14  [ТС] #3
Да, да, да!
В copy ошибка была и правда,
string работает нормально и без c_str()

Исправил класс, теперь все запускает без ошибок:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
class ToursManager {
private:
    std::vector<TourEntry> _tours;
    std::queue<TourEntry> _history;
 
public:
    ToursManager(){}
    ~ToursManager(){}
 
public:
    bool AddDataFromFile(std::string fileName) {
        std::fstream file(fileName, std::ios::in);
        if (!file.is_open()) return false;
 
        std::istream_iterator<TourEntry> reader(file);
        std::istream_iterator<TourEntry> readerEOF;
        copy (reader, readerEOF, back_inserter(_tours));
 
        file.close();
        return true;
    }
 
    unsigned int GetSize() const {
        return (unsigned int)_tours.size();
    }
 
    TourEntry FindByTourName(std::string tourName) {
        std::vector<TourEntry>::const_iterator finder;
        finder = std::find_if(_tours.begin(), _tours.end(),
                             [tourName](const TourEntry& te){ 
                             return te.TourName == tourName;}
        );
        if (finder != _tours.end()) {
            _history.push(*finder);
            return *finder;
        } else {
            return TourEntry();
        }
    }
 
    friend std::ostream &operator<<(std::ostream &stream, const ToursManager &tm) {
        std::for_each(tm._tours.begin(), tm._tours.end(), [&stream](TourEntry te) {
            stream << te;
            stream << std::endl;
        });
        return stream;
    }
};
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2011, 21:14
Привет! Вот еще темы с ответами:

Всплывает реклама и нежелательные сайты когда использую гугл - Удаление вирусов
Когда кликаю на сайты или хочу выбрать какую-нибудь тему (оставить комментарий, создать тему, зарегистрироваться) зависает окно, а потом...

phpStorm: Когда пишу скрипт, использую jQuery-функцию, компилятор подчеркивает её, как ошибку - JavaScript
Доброго времени суток. Пробую осваивать php. В качестве среды выбрал phpStorm. Когда пишу скрипт, использую jQuery-функцию, но ее...

Не сохраняются значения в свойстве своего UserControl в режиме конструктора форм, когда я его использую в другом проекте - C#
Ситуация: я создал свой контрол, который содержит TextBox и добавил несколько свойств. Далее я этот свой контрол подключил во втором...

STL Заполнить строку латинским алфавитом и вывести ее в выходной поток - C++
Заполнить строку латинским алфавитом и вывести ее в выходной поток. С++ Добавлено через 20 минут вот пример выполнения, но в нем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru