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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 51, средняя оценка - 4.90
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
#1

STL std::set, std::pair, std::make_pair - C++

04.08.2010, 02:58. Просмотров 6616. Ответов 14
Метки stl (Все метки)

Я не знаю как описать тему в двух словах, поэтому не обращайте внимание на название темы.
Собственно перейдем к нашим баранам: есть пользовательский класс (условно дерево):
C++
1
2
3
4
5
6
7
8
9
    class tree {
        double age, height;
        std::string name;
    public:
        tree(std::string);
        bool operator == (tree);
        bool operator > (tree);
        bool operator < (tree);    
    };
На его основе строится еще один класс (лес):
C++
1
2
3
4
5
6
7
    class forest {
        int x, y;
        std::set<std::pair<tree, std::pair<int, int> > > list;
    public:
        forest(int, int); // кроме конструктора еще куча функций
        void addTree(std::string);
    };
Все как-бы хорошо, но вот этот метод:
C++
1
2
3
4
5
6
    void forest::addTree(std::string Name){
        tree newTree(Name);
        std::pair<int, int> position = std::make_pair(rand()%this->x, rand()%this->y);
        std::pair<tree, std::pair<int, int> > newElement(newTree,position);
        this->list.insert(newElement);
    }
Вопреки всему отказывается работать. Работаю в VS 2008 Express, компилятор выдает ошибку:
1> c:\program files\microsoft visual studio 9.0\vc\include\utility(87) : error C2678: binary '<' : no operator found which takes a left-hand operand of type 'const test::tree' (or there is no acceptable conversion)
1> e:\work\проект nautilus\test.hpp(38): could be 'bool test::tree::operator <(test::tree)'

Перейдя по первой ссылку получаем следующий код из хедера utility:
C++
1
2
3
4
5
6
7
8
template<class _Ty1,
    class _Ty2> inline
    bool operator<(const pair<_Ty1, _Ty2>& _Left,
        const pair<_Ty1, _Ty2>& _Right)
    {   // test if _Left < _Right for pairs
    return (_Left.first < _Right.first ||  // курсор становиться на эту строку
        !(_Right.first < _Left.first) && _Left.second < _Right.second);
    }
К чему это ума не приложу, так как у меня не пара пар, а пара класса и пары.
По поводу второй строки: у меня классы расположены в пространстве имен "test" и оформлены в виде:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
namespace test {
    class tree {/* Описания я буду опускать, что-бы показать саму структуру */};
    // собственно конструктор, и все функции оформлены в том-же виде
    tree::tree(std::string Name = ""){
        this->incA = 1 / 12;
        this->incH = 0.24;
        this->name = Name;
    }
    bool tree::operator < (tree a){
        return this->height < a.getHeight();
    }
    class forest {/* Описания я буду опускать, что-бы показать саму структуру */};
    // а вот и проблемный метод
    void forest::addTree(std::string Name){
        tree newTree(Name);
        std::pair<int, int> position = std::make_pair(rand()%this->x, rand()%this->y);
        std::pair<tree, std::pair<int, int> > newElement(newTree,position);
        this->list.insert(newElement);
    }
};
Так вот, судя по ошибке нужно-было прописать доступ к пространству имен и только потом извлекать метод из класса, но это странно, так как его описание находиться непосредственно внутри пространства имен и по сути он имеет прямой доступ ко всему что находится внутри того пространства имен, в котором он находится.
Вот только в чем проблема не понимаю а ошибки сами по себе не деваются.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.08.2010, 02:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос STL std::set, std::pair, std::make_pair (C++):

Стандартный поток и 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; ...

Не воспринимает ни std::cout, ни std::cin. Вобщем ничего из std. Также не понимает iostream - C++
Здравствуйте! Я хотел начать изучать язык C++. Набрал литературы. Установил Microsoft Visual C++ 2005 Express Edition. Образ диска...

ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri - C++
на вод поступают 2 строки типа string. определить количество вхождений строки 2 в строку 1 ошибка error: cannot convert 'std::string {aka...

"range-base for" и проверка на последний элемент в std::set<std::string> - C++
Добрый день. Голова совсем не варит. Как мне организовать простую проверку на послений элемент без введения счетчика а просто сравнивая...

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами - C++
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же числа, но не в виде строк, а в виде...

Std::vector<std::pair<std::vector<int>::iterator, std::vector<int>::iterator> - C++
Вопрос по вектору. Допустим есть вектор, std::vector&lt;int&gt; vec; на каком - то этапе заполнения я ставлю закладку итератора, ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ISergey
Maniac
Эксперт С++
1374 / 885 / 52
Регистрация: 02.01.2009
Сообщений: 2,658
Записей в блоге: 1
04.08.2010, 04:06 #2
outoftime, Приведи полностью не рабочий пример кода.. ( здесь так не угадаешь.. )

ЗЫ.. Везде где можно используй ссылку на константу ( или как там по умному (не помню просто) )
Тооесть вместо этого
C++
1
2
3
4
5
6
7
8
9
class tree {
                double age, height;
                std::string name;
        public:
                tree(std::string);
                bool operator == (tree);
                bool operator > (tree);
                bool operator < (tree);    
        };
примерно так
C++
1
2
3
4
5
6
7
8
9
class tree {
                double age, height;
                std::string name;
        public:
                tree(const std::string&);
                bool operator == (const tree&);
                bool operator > (const tree&);
                bool operator < (const tree&);    
        };
1
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
04.08.2010, 04:13  [ТС] #3
Теперь выбивает вот такое:
error C2662: 'test::tree::getAge' : cannot convert 'this' pointer from 'const test::tree' to 'test::tree &'
Код в полном обьеме.
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#include <algorithm>
#include <iostream>
#include <vector>
#include <string>
#include <set>
 
#define SQR(a) ( (a) * 1ll * (a) )
 
namespace test {
 
    ////////////////////////////////////////////////////////////////////////////////////
    //
    // Class Tree
    //
    ////////////////////////////////////////////////////////////////////////////////////
 
    class tree {
        double age, height;
        std::string name;
        static double incA, incH;
    public:
        tree(std::string);
        // исполнение действия расти, при котором на константы увеличиваются «высота» и «возраст»
        void Incrementation();
        // получение ...
        std::string getName();
        // изменение названия (прямое изменение поля класса недопустимо).
        void setName(std::string);
        // получение возраста дерева без возможности его изменения
        double getAge();
        // получение высоты дерева без возможности его изменения
        double getHeight();
        // копирование объектов
        tree operator = (const tree&);
        // сравнение объектов
        bool operator == (tree);
        bool operator > (tree);
        bool operator < (tree);
    };
 
    tree::tree(std::string Name = ""){
        this->incA = 1 / 12;
        this->incH = 0.24;
        this->name = Name;
    }
    void tree::Incrementation(){
        this->age += this->incA;
        this->height += this->incH;
    }
    std::string tree::getName(){
        return this->name;
    }
    void tree::setName(std::string val){
        this->name = val;
    }
    double tree::getAge(){
        return this->age;
    }
    double tree::getHeight(){
        return this->height;
    }
    tree tree::operator = (tree a) {
        this->name = a.getName();
        this->age = a.getAge();
        this->height = a.getHeight();
        return *this;
    }
    bool tree::operator == (tree a){
        return this->height == a.getHeight();
    }
    bool tree::operator > (tree a){
        return this->height > a.getHeight();
    }
    bool tree::operator < (tree a){
        return this->height < a.getHeight();
    }
 
    ////////////////////////////////////////////////////////////////////////////////////
    //
    // Class Forest
    //
    ////////////////////////////////////////////////////////////////////////////////////
 
    // Нужна для опредиления пользовательской сортировки используя STL
    bool sortFunc(tree *a, tree *b){
        return a->getName() > b->getName();
    }
 
    class forest {
        int x, y;
        std::set<std::pair<tree, std::pair<int, int> > > list;
    public:
        forest(int, int);
        // добавление по случайным координатам (генерируются классом)
        void addTree(std::string);
        // удаление деревьев
        void delTree(std::string);
        // получение количества деревьев в лесу
        int getTreesNumber();
        // получение отсортированного по названиям списка деревьев в виде указателей на объекты
        std::vector<tree*> getTreesList();
        // получение количества деревьев в круговой области с центром (x0,y0) и радиусом r
        int getTreesInCircle(int, int, int);
        // поиск дерева по заданному названию и возврат указателя на объект
        tree* getTreeByName(std::string);
    };
 
    forest::forest(int X, int Y){
        this->x = X;
        this->y = Y;
    }
    void forest::addTree(std::string Name){
        tree newTree(Name);
        std::pair<int, int> position = std::make_pair(rand()%this->x, rand()%this->y);
        std::pair<tree, std::pair<int, int> > newElement(newTree,position); //= std::make_pair<newTree, position>;
        this->list.insert(newElement);
    }
    void forest::delTree(std::string Name){
        bool was = 1;
        std::set<std::pair<tree, std::pair<int, int> > > :: iterator it;
        for (it = this->list.begin(); it != this->list.end(); ++it, (it == this->list.end() ? was = 0 : 0))
            if (it->first.getName() == Name) break;
        if (was) this->list.erase(it);
    }
    int forest::getTreesNumber(){
        return this->list.size();
    }
    std::vector<tree*> forest::getTreesList(){
        std::vector<tree*> res;
        std::set<std::pair<tree, std::pair<int, int> > > :: iterator it;
        for (it = this->list.begin(); it != this->list.end(); ++it)
            res.push_back(&(it->first));
        std::sort(res.begin(), res.end(), sortFunc);
        return res;
    }
    int forest::getTreesInCircle(int X, int Y, int R){
        int res = 0;
        std::set<std::pair<tree, std::pair<int, int> > > :: iterator it;
        for (it = this->list.begin(); it != this->list.end(); ++it)
            // проверка в целых числа, что-бы не терять точность, но при больщих размерах леса прийдется использовать даблы
            if ( SQR(it->second.first - X) + SQR(it->second.second - Y) <= SQR(R) ) ++res; 
        return res;
    }
    tree* forest::getTreeByName(std::string Name){
        std::set<std::pair<tree, std::pair<int, int> > > :: iterator it;
        for (it = this->list.begin(); it != this->list.end(); ++it)
            if (it->first.getName() == Name) return &(it->first);
        return 0;
    }
 
    // end namespace "test"
};
0
ISergey
Maniac
Эксперт С++
1374 / 885 / 52
Регистрация: 02.01.2009
Сообщений: 2,658
Записей в блоге: 1
04.08.2010, 04:36 #4
эх.. main не хватает.. но ладно утром разберемся.. ))
1
easybudda
Модератор
Эксперт CЭксперт С++
9622 / 5570 / 946
Регистрация: 25.07.2009
Сообщений: 10,695
04.08.2010, 04:38 #5
Цитата Сообщение от ISergey Посмотреть сообщение
bool operator == (const tree&);
C++
1
bool operator == (const tree&) const;
и далее по списку...
1
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
04.08.2010, 04:52  [ТС] #6
ISergey, меня не волнует что будет в мэйне, моя задача - хэдер.
вот что поменял:
C++
1
2
3
4
5
6
7
8
9
10
11
12
        bool operator == (const tree&) const;
        bool operator > (const tree&) const;
        bool operator < (const tree&) const;
..............................................................................
    bool tree::operator == (const tree &a){
        return this->height == a.getHeight();
    }
    bool tree::operator > (const tree &a){
        return this->height > a.getHeight();
    }
    bool tree::operator < (const tree &a){
        return this->height < a.getHeight();
И вот новые ошибки:
1>e:\work\проект nautilus\test.hpp(68) : error C2511: 'bool test::tree::operator ==(const test::tree &)' : overloaded member function not found in 'test::tree'
1> e:\work\проект nautilus\test.hpp(17) : see declaration of 'test::tree'


Добавлено через 1 минуту
Если не сложно подскажите хотя-бы куда рыть.
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
04.08.2010, 13:09 #7
outoftime, в прототипе у вас функция константная. В определении нет.
Т.е. скорее всего так:

bool tree::operator == (const tree &a) const
И далее по списку.
1
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
05.08.2010, 00:47  [ТС] #8
Значить подвожу краткий итог, что-бы не надо было читать все предыдущие посты кроме первого:
1. если переписать
C++
1
2
3
4
5
6
7
8
9
    class tree {
        bool operator == (const tree&) const;
        bool operator >  (const tree&) const;
        bool operator <  (const tree&) const;
    };
//*****************************************
    bool tree::operator == (const tree &a)const{/*содержимое не менялось*/}
    bool tree::operator >  (const tree &a)const{/*содержимое не менялось*/}
    bool tree::operator <  (const tree &a)const{/*содержимое не менялось*/}
вылетает ошибка:
error C2662: 'test::tree::getHeight' : cannot convert 'this' pointer from 'const test::tree' to 'test::tree &'

2. если переписать
C++
1
2
3
4
5
/*содержимое класса в предыдущем коде*/
//*****************************************
    bool tree::operator == (const tree &a){}
    bool tree::operator > (const tree &a){}
    bool tree::operator < (const tree &a){}
тогда получаем:
error C2511: 'bool test::tree::operator ==(const test::tree &)' : overloaded member function not found in 'test::tree'

Кто-то знает хотя-бы куда копать?

Добавлено через 6 часов 48 минут
У кого-то есть хотя-бы какие-то предположения в чем может быть ошибка, а главное варианты решения?
0
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
05.08.2010, 10:03 #9
вот исправленный класс tree. ошибок море было. сейчас еще с оставшимся лесом разберусь.
да, кстати, у тебя есть две переменные статические в классе. они нигде не были определены. я присвоил им значение по 5.0. в коде найдешь - заменишь на свои.
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
        ////////////////////////////////////////////////////////////////////////////////////
        //
        // Class Tree
        //
        ////////////////////////////////////////////////////////////////////////////////////
 
        class tree {
                double age, height;
                std::string name;
                static double incA, incH;
        public:
                tree(std::string);
                // исполнение действия расти, при котором на константы увеличиваются «высота» и «возраст»
                void Incrementation();
                // получение ...
                std::string getName() const;
                // изменение названия (прямое изменение поля класса недопустимо).
                void setName(std::string);
                // получение возраста дерева без возможности его изменения
                double getAge() const;
                // получение высоты дерева без возможности его изменения
                double getHeight() const;
                // копирование объектов
                tree operator = (const tree&);
                // сравнение объектов
                bool operator == (const tree&) const;
                bool operator > (const tree&) const;
                bool operator < (const tree&) const;
        };
 
        double tree::incA = 5.0;
        double tree::incH = 5.0;
 
        tree::tree(std::string Name = ""){
                this->incA = 1 / 12;
                this->incH = 0.24;
                this->name = Name;
        }
        void tree::Incrementation(){
                this->age += this->incA;
                this->height += this->incH;
        }
        std::string tree::getName() const{
                return this->name;
        }
        void tree::setName(std::string val){
                this->name = val;
        }
        double tree::getAge() const{
                return this->age;
        }
        double tree::getHeight() const{
                return this->height;
        }
        tree tree::operator = (const tree& a) {
                this->name = a.getName();
                this->age = a.getAge();
                this->height = a.getHeight();
                return *this;
        }
        bool tree::operator == (const tree& a) const{
                return this->height == a.getHeight();
        }
        bool tree::operator > (const tree& a) const{
                return this->height > a.getHeight();
        }
        bool tree::operator < (const tree& a) const{
                return this->height < a.getHeight();
        }
Добавлено через 10 минут
вот переделанный лес. но честно. я бы на вашем месте переписал код еще раз, только медленно, вдумчиво, с чувством, с толком, с расстановкой. потому сейчас сложно предположить, что из этого выйдет.
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
        ////////////////////////////////////////////////////////////////////////////////////
        //
        // Class Forest
        //
        ////////////////////////////////////////////////////////////////////////////////////
 
        // Нужна для опредиления пользовательской сортировки используя STL
        bool sortFunc(tree *a, tree *b){
                return a->getName() > b->getName();
        }
 
        class forest {
                int x, y;
                std::set<std::pair<tree, std::pair<int, int> > > list;
        public:
                forest(int, int);
                // добавление по случайным координатам (генерируются классом)
                void addTree(std::string);
                // удаление деревьев
                void delTree(std::string);
                // получение количества деревьев в лесу
                int getTreesNumber() const;
                // получение отсортированного по названиям списка деревьев в виде указателей на объекты
                std::vector<tree*> getTreesList() const;
                // получение количества деревьев в круговой области с центром (x0,y0) и радиусом r
                int getTreesInCircle(int, int, int);
                // поиск дерева по заданному названию и возврат указателя на объект
                const tree* getTreeByName(const std::string&) const;
        };
 
        forest::forest(int X, int Y){
                this->x = X;
                this->y = Y;
        }
        void forest::addTree(std::string Name){
                tree newTree(Name);
                std::pair<int, int> position = std::make_pair(rand()%this->x, rand()%this->y);
                std::pair<tree, std::pair<int, int> > newElement(newTree,position); //= std::make_pair<newTree, position>;
                this->list.insert(newElement);
        }
        void forest::delTree(std::string Name){
                bool was = 1;
                std::set<std::pair<tree, std::pair<int, int> > > :: iterator it;
                for (it = this->list.begin(); it != this->list.end(); ++it, (it == this->list.end() ? was = 0 : 0))
                        if (it->first.getName() == Name) break;
                if (was) this->list.erase(it);
        }
        int forest::getTreesNumber() const{
                return this->list.size();
        }
        std::vector<tree*> forest::getTreesList() const{
                std::vector<tree*> res;
                std::set<std::pair<tree, std::pair<int, int> > > :: iterator it;
                for (it = this->list.begin(); it != this->list.end(); ++it)
                    res.push_back(const_cast<tree*>(&(it->first)));
                std::sort(res.begin(), res.end(), sortFunc);
                return res;
        }
        int forest::getTreesInCircle(int X, int Y, int R){
                int res = 0;
                std::set<std::pair<tree, std::pair<int, int> > > :: iterator it;
                for (it = this->list.begin(); it != this->list.end(); ++it)
                        // проверка в целых числа, что-бы не терять точность, но при больщих размерах леса прийдется использовать даблы
                        if ( SQR(it->second.first - X) + SQR(it->second.second - Y) <= SQR(R) ) ++res; 
                return res;
        }
        const tree* forest::getTreeByName(const std::string &Name) const{
                std::set<std::pair<tree, std::pair<int, int> > > :: iterator it;
                for (it = this->list.begin(); it != this->list.end(); ++it)
                        if (it->first.getName() == Name) return &(it->first);
                return 0;
        }
1
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
05.08.2010, 12:36  [ТС] #10
fasked, Спасибо за код, можете сказать как называются разделы, в которых у меня были ошибки?
0
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
05.08.2010, 13:04 #11
Цитата Сообщение от outoftime Посмотреть сообщение
как называются разделы, в которых у меня были ошибки?
во-первых, как выше уже говорилось, пытайтесь всунуть const где только можно.
если метод не будет изменять данные класса, определяйте его как const. если аргумент метода не будет изменяться в методе - определяйте его как const.
теперь пройдемся по вашему коду. конструктор класса
C++
1
tree(std::string);
конструктор класса дерево принимает строку - имя дерева. почему она не константа? она же всего лишь копируется в строку в классе.
на этом же месте, почему аргумент является объектом, а не ссылкой на объект? это лишнее копирование. раз аргумент у нас константный, то изменяться он не может, следовательно можно смело передавать строку по ссылке, а не по значению.
в итоге применив все замечания мы получаем нормальный прототип конструктора:
C++
1
tree(const std::string&);
далее рассмотрим метод, который возвращает имя
C++
1
std::string getName();
он тожн должен быть константным, ведь он не изменяет данные класса. вернее не должен их изменять. в итоге получаем такой прототип:
C++
1
std::string getName() const;
в общем вот эти два косяк разбросаны по всему классу. то есть методы getHeight, getAge - тоже должны быть определены константой, так же как и операторы сравнения. операторы сравнения кстати так же должны принимать константную ссылку на объект типа дерево, а не сам объект.

ну и две неинициализированные статические переменные. кстати совершенно незачем инициализировать их в конструкторе. я забыл совсем про этот момент то есть заметил только сейчас. инициализируйте их вот так, только значения свои поставьте:
C++
1
2
double tree::incA = 5.0;
double tree::incH = 5.0;
и если они не изменяются может стоит сделать их константами

в классе леса в принципе все те же самые косяки, за исключением одного метода. в методе getTreeList пришлось сделать const_cast. чтобы указатель все таки скопировался. не знаю зачем кстати этот метод. с указателями в С++ лучше не баловаться.
0
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
05.08.2010, 15:25  [ТС] #12
Мне пришлось присваивать константный идентификатор еще здесь:
C++
1
2
3
4
5
6
    tree *forest::find(const std::string &Name) const {
        std::set<std::pair<tree,std::pair<int,int> > > :: iterator it;
        for (it = this->List.begin(); it != this->List.end(); ++it)
            if (it->first.getName() == Name) return const_cast<tree *>(&(it->first));
        return 0;
    }
Кроме того метод:
C++
1
2
3
4
5
6
7
8
    std::vector<tree *> forest::getTreeList() const {
        std::vector<tree *> res;
        std::set<std::pair<tree,std::pair<int,int> > > :: iterator it;
        for (it = this->List.begin(); it != this->List.end(); ++it)
            res.push_back(const_cast<tree *>(&(it->first)));
        std::sort(res.begin(), res.end(), sortFunc);
        return res;
    }
На wxDev-C++ под GCC компилируется без проблем, а на VS 2008 Express выдает ошибку:
e:\work\проект nautilus\new\test.hpp(150) : error C2679: binary '=' : no operator found which takes a right-hand operand of type 'std::_Tree<_Traits>::const_iterator' (or there is no acceptable conversion)
with
[
_Traits=std::_Tset_traits<std::pair<test::tree,std::pair<int,int>>,std::less<std::pair<test::tree,std::pair<int,int>>>,std::allocator<std::pair<test::tree,std::pair<int,int>>>,false>
]
c:\program files\microsoft visual studio 9.0\vc\include\xtree(498): could be 'std::_Tree<_Traits>::iterator &std::_Tree<_Traits>::iterator::operator =(const std::_Tree<_Traits>::iterator &)'
with
[
_Traits=std::_Tset_traits<std::pair<test::tree,std::pair<int,int>>,std::less<std::pair<test::tree,std::pair<int,int>>>,std::allocator<std::pair<test::tree,std::pair<int,int>>>,false>
]
while trying to match the argument list '(std::_Tree<_Traits>::iterator, std::_Tree<_Traits>::const_iterator)'
with
[
_Traits=std::_Tset_traits<std::pair<test::tree,std::pair<int,int>>,std::less<std::pair<test::tree,std::pair<int,int>>>,std::allocator<std::pair<test::tree,std::pair<int,int>>>,false>
]
0
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
05.08.2010, 16:43  [ТС] #13
Ошибка вылетает, когда в цикле пытаюсь инициализировать итератор начальным значением. На сколько я видел, в том файле действительно нет оператора присвоения.
0
easybudda
Модератор
Эксперт CЭксперт С++
9622 / 5570 / 946
Регистрация: 25.07.2009
Сообщений: 10,695
05.08.2010, 17:04 #14
outoftime, я вот тут что подумал... а не проще в класс tree включить координаты, в которых дерево посажено, а то таскать вот такую
C++
1
<std::pair<tree,std::pair<int,int> > >
беду как-то хлопотно... тогда и класс forest организовать гораздо легче будет...
0
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
05.08.2010, 18:01  [ТС] #15
Это не совсем то что надо, так как деревья могут расти даже в пустыни, где нет лесов.

Добавлено через 22 минуты
C++
1
2
3
4
    typedef std::pair<int,int> PII;
    typedef std::pair<tree,PII> PTP;
//-------------------------------------
for (std::set<PTP> :: iterator it = this->List.begin(); it != this->List.end(); ++it)
Приведенный код - абсолютно верный, ошибка, как оказалось в другом:
C++
1
Type forest::method (params) const {}
Ошибка была в том, что не надо было ставить конст в конце функции. Это меня и вводить в недоразумение, в каких случаях надо его использовать, а когда нельзя?

Добавлено через 1 минуту
К слову
C++
1
const_cast<std::set<PTP>::iterator>(this->List.begin())
почему-то также не работает, когда перед телом функции стоит идентификатор const

Добавлено через 15 минут
http://duramecho.com/ComputerInforma...wCppConst.html - Вот нашел внятный рассказ о том, где и когда использовать идентификатор const.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2010, 18:01
Привет! Вот еще темы с ответами:

Реализовать пользовательский класс Pair (упрощённый аналог std::pair) - C++
Здравствуйте. Проблема с выводом. В приложенном задании, требуется сделать вывод как в примере. Мой вывод основан на вводе количества...

(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const& - C++
astxx::manager::connection::connection(std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; const&amp;, unsigned short); ...

Реализация класса MyString. Стандартная библиотека, std::string, std::vector - C++
как добавить реализацию конкатенации строк через перегрузку оператора &quot;+=&quot; в классе MyString и почему ошибка выдается???#include...

Как искать по std::vecotr из std::pait по одному значению из пары? - C++
? :) Пункт 4.7 Правил: Как можно более полно описывайте суть проблемы или вопроса, что было сделано для ее решения и какие результаты...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
05.08.2010, 18:01
Ответ Создать тему
Опции темы

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