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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Как написать макрос - модуль числа... http://www.cyberforum.ru/cpp-beginners/thread157244.html
Помогите написать макрос на с++, возвращающий модуль числа... Добавлено через 4 минуты Нашёл..
C++ Изменение значения статической переменной не дает =\ static char text; text = ""; error: expression must be a modifiable lvalue это же не конст, а просто статик, в pawn"е часто пользовался static и ок всё было http://www.cyberforum.ru/cpp-beginners/thread157228.html
Часы в псевдографике C++
доброго времени суток. задание заключается в написании программы, отображающую на экране текущее время в виде циферблата с секундной,минутной и часовой стрелками(разных цветов). и сохранять картинку в файле по желанию пользователя. заранее благодарен.
Модификация объекта string через ссылку и указатель C++
Создайте две функции: первая должна получать аргумент типа string*, вторая - srting&. Каждая функция должна изменять объект string своим способом. В функции main сопсно вызываем и выводим изменёные строки. #include <iostream> #include <string> void ukazatel(std::string* p) { }
C++ Определить в какой четверти будет больше всего точек из 10 введенных. http://www.cyberforum.ru/cpp-beginners/thread157138.html
Задание такое: Ввести 10 раз координат х, у и определить в какой четверти их будет больше всего. Вот мой код#include <stdafx.h> #include <cmath> #include <iostream> using namespace std; void main() { int I, II, III, IV, x, y, i; for (i=0; i<10; i++) { cout<<"Enter your coords:"<<endl;
C++ Уведомление об ошибке в функции... Есть функция которая в процессе выполнения получает значение t, если (t < 0) значения нет. Как уведомить об этом пользователя функции? Если сделать доп. функцию проверки, то вычисления будут проводится дважды... T3DPoint Ray_And_Plane_Intersection(TRay Ray, TPlane Plane) { float t =... подробнее

Показать сообщение отдельно
outoftime
║XLR8║
508 / 430 / 33
Регистрация: 25.07.2009
Сообщений: 2,295

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

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

Я не знаю как описать тему в двух словах, поэтому не обращайте внимание на название темы.
Собственно перейдем к нашим баранам: есть пользовательский класс (условно дерево):
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);
    }
};
Так вот, судя по ошибке нужно-было прописать доступ к пространству имен и только потом извлекать метод из класса, но это странно, так как его описание находиться непосредственно внутри пространства имен и по сути он имеет прямой доступ ко всему что находится внутри того пространства имен, в котором он находится.
Вот только в чем проблема не понимаю а ошибки сами по себе не деваются.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru