Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.58/55: Рейтинг темы: голосов - 55, средняя оценка - 4.58
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5

STL std::set, std::pair, std::make_pair

04.08.2010, 02:58. Показов 11440. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.08.2010, 02:58
Ответы с готовыми решениями:

Стандартный поток и STL (std::copy to std::cout)
#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++. Набрал литературы. Установил Microsoft Visual C++ 2005 Express Edition. Образ диска...

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

14
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
04.08.2010, 04:06
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
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
04.08.2010, 04:13  [ТС]
Теперь выбивает вот такое:
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
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
04.08.2010, 04:36
эх.. main не хватает.. но ладно утром разберемся.. ))
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
04.08.2010, 04:38
Цитата Сообщение от ISergey Посмотреть сообщение
bool operator == (const tree&);
C++
1
bool operator == (const tree&) const;
и далее по списку...
1
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
04.08.2010, 04:52  [ТС]
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
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
04.08.2010, 13:09
outoftime, в прототипе у вас функция константная. В определении нет.
Т.е. скорее всего так:

bool tree::operator == (const tree &a) const
И далее по списку.
1
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
05.08.2010, 00:47  [ТС]
Значить подвожу краткий итог, что-бы не надо было читать все предыдущие посты кроме первого:
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
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
05.08.2010, 10:03
вот исправленный класс 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
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
05.08.2010, 12:36  [ТС]
fasked, Спасибо за код, можете сказать как называются разделы, в которых у меня были ошибки?
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
05.08.2010, 13:04
Цитата Сообщение от 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
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
05.08.2010, 15:25  [ТС]
Мне пришлось присваивать константный идентификатор еще здесь:
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>>>,s td::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::opera tor =(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>>>,s td::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>>>,s td::allocator<std::pair<test::tree,std:: pair<int,int>>>,false>
]
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
05.08.2010, 16:43  [ТС]
Ошибка вылетает, когда в цикле пытаюсь инициализировать итератор начальным значением. На сколько я видел, в том файле действительно нет оператора присвоения.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
05.08.2010, 17:04
outoftime, я вот тут что подумал... а не проще в класс tree включить координаты, в которых дерево посажено, а то таскать вот такую
C++
1
<std::pair<tree,std::pair<int,int> > >
беду как-то хлопотно... тогда и класс forest организовать гораздо легче будет...
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
05.08.2010, 18:01  [ТС]
Это не совсем то что надо, так как деревья могут расти даже в пустыни, где нет лесов.

Добавлено через 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/ComputerI... Const.html - Вот нашел внятный рассказ о том, где и когда использовать идентификатор const.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.08.2010, 18:01
Помогаю со студенческими работами здесь

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

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

Std::begin() ,std::end(),std::copy
...// int main() { std::vector&lt;double&gt; data;//Работает cout &lt;&lt; std::begin(data); double *data=new double; ...

Std::bind, std::mem_fun, std::mem_fn
В чем разница между функциями std::bind, std::mem_fun, std::mem_fn?

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru