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

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

Восстановить пароль Регистрация
 
DWand
 Аватар для DWand
13 / 13 / 1
Регистрация: 23.04.2011
Сообщений: 99
07.12.2011, 20:25     STL. Не работает вывод через << в поток когда использую итераторы :( #1
Вроде бы ничего сложного, но почему-то работать не хочет. Никак не могу понять почему (
Ругается, когда пишу
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 ошибки (
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.12.2011, 20:25     STL. Не работает вывод через << в поток когда использую итераторы :(
Посмотрите здесь:

STL и поток C++
Реверс строки через итераторы C++
C++ Цикл не через итераторы
C++ Выполнить перестановку через итераторы
C++ STL Заполнить вектор длинной 10 случайными числами от 0 до 9 и вывести его в выходной поток
C++ STL Заполнить строку латинским алфавитом и вывести ее в выходной поток
C++ STL. Итераторы и последовательные контейнеры
Найти элемент в контейнере priority_queue, используя STL вские итераторы и алгоритмы C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
07.12.2011, 21:02     STL. Не работает вывод через << в поток когда использую итераторы :( #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.
DWand
 Аватар для DWand
13 / 13 / 1
Регистрация: 23.04.2011
Сообщений: 99
07.12.2011, 21:14  [ТС]     STL. Не работает вывод через << в поток когда использую итераторы :( #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;
    }
};
Yandex
Объявления
07.12.2011, 21:14     STL. Не работает вывод через << в поток когда использую итераторы :(
Ответ Создать тему
Опции темы

Текущее время: 04:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru