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

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

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

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

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

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

Цикл не через итераторы - C++
Как записать вот эти функции без помощи итераторов? string java_to_cpp(string str ) { for (string::iterator it = str.begin() ;...

Потоковые итераторы - не работает код - C++
Выношу на ваш суд следующий код, взятый мной из учебника Лафоре int main() { setlocale( LC_ALL, &quot;rus&quot; ); list&lt;int&gt;...

Реверс строки через итераторы - C++
std::string s=&quot;123456&quot;; s.replace(s.begin(),s.end(),s.rbegin(),s.rend()); std::cout&lt;&lt;s&lt;&lt;std::endl; Почему-то работает правильно и...

Выполнить перестановку через итераторы - C++
#include &lt;fstream&gt; #include &lt;algorithm&gt; #include &lt;vector&gt; using namespace std; int main() {

Стандартный поток и STL (std::copy to std::cout) - C++
#include &lt;iostream&gt; #include &lt;sstream&gt; #include &lt;algorithm&gt; #include &lt;functional&gt; #include &lt;string&gt; using namespace std; ...

Не работает вывод двумерного массива через метод класса - C++
При обращении к методу getStringSymbol и getAllStrings прога вылетает, помогите пожалуйста #include &quot;stdafx.h&quot; #include &quot;iostream&quot; ...

Не работает binary_search из STL - C++
привет всем! какойто глюк или я что то не понимаю...применяю бинарный поиск из stl, и в итоге он не всегда правильно работает...пользуюсь...

Вывод вектора (STL) справа налево - C++
Подскажите как вывести вектор начиная с его последнего элемента? for (vector&lt;char&gt;::iterator _pos = buffer.end() - 1; _pos &gt;=...

STL не работает функция search() - C++
Добрый день! Подскажите пожалуйста, почему функция search не работает в массивом, который сформирован функцией myfunct()? Данный код...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1482 / 1058 / 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
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;
    }
};
Ответ Создать тему
Опции темы

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