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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
no0ker
101 / 88 / 4
Регистрация: 17.12.2010
Сообщений: 416
#1

не могу понять почему не работает std::sort() - C++

31.03.2011, 17:34. Просмотров 2035. Ответов 14
Метки нет (Все метки)

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
#include <vector>
#include <algorithm>
 
using namespace std;
 
class T{
    public:
        T(int a_, int b_) : a(a_), b(b_){}
 
        bool operator < (T other){
            return Mid() < other.Mid();
        }
 
        int Mid(){
            return (a+b)/2;
        }
    private:
        int a,b;
};
 
 
 
int main()
{
    T t1(10, 20), t2(0, 50), t3(100, 200), t4(60, 100);
    vector<T> in;
 
    in.push_back(t1);
    in.push_back(t2);
    in.push_back(t3);
    in.push_back(t4);
 
    sort(in.begin(), in.end()); // вылетает с непонятной ошибкой 
    // stl_algo.h|89|error: passing 'const T' as 'this' argument of 'bool T::operator<(T)' discards qualifiers|
 
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.03.2011, 17:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос не могу понять почему не работает std::sort() (C++):

Не могу понять почему не работает (или правильно не работает) - C++
#include &lt;iostream.h&gt; #include &lt;conio.h&gt; #define N 5 #define M 3 void main() { int a; int i,j; cout&lt;&lt;&quot;nachalnya...

Не могу понять почему не работает - C++
#include &lt;iostream&gt; using namespace std; int main() { double a; double b; cout&lt;&lt;&quot;vvedite sumu deposita&quot;; cin&gt;&gt;a; ...

Не могу понять почему не работает - C++
#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; const int arrSize = 15; int main() { string Phone; ...

Не могу понять почему не работает - C++
#include &quot;stdio.h&quot; #include &quot;math.h&quot; #include &quot;conio.h&quot; #define E 1e-6 int main() { float x,y,a; int n; ...

не могу понять почему не работает - C++
Пожалуйста ,помоги,найти ошибку... услвие задачи Подсчитать количество вхождений букв и слов в тексте #include&lt;fstream.h&gt; ...

не могу понять почему не работает программа - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;clocale&gt; #include &lt;cmath&gt; using namespace std; int main () { setlocale...

14
bambino
193 / 19 / 4
Регистрация: 05.08.2010
Сообщений: 229
31.03.2011, 17:54 #2
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
#include <vector>
#include <algorithm>
 
using namespace std;
 
class T{
    public:
        T(){}
        T(int a_, int b_) : a(a_), b(b_){}
 
        friend bool operator < (T, T);
 
        int Mid(){
            return (a+b)/2;
        }
    private:
        int a,b;
};
 
bool operator < (T other, T _other){
  return _other.Mid() < other.Mid();
}
 
int main()
{
    T t1(10, 20), t2(0, 50), t3(100, 200), t4(60, 100);
    vector<T> in;
 
    in.push_back(t1);
    in.push_back(t2);
    in.push_back(t3);
    in.push_back(t4);
 
    sort(in.begin(), in.end()); // вылетает с непонятной ошибкой
    // stl_algo.h|89|error: passing 'const T' as 'this' argument of 'bool T::operator<(T)' discards qualifiers|
 
    return 0;
}
1
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
31.03.2011, 17:59 #3
C++
1
bool operator < (const T & other)
Добавлено через 1 минуту
Цитата Сообщение от no0ker Посмотреть сообщение
passing 'const T' as 'this' argument of 'bool T::operator<(T)' discards qualifiers
Собственно, передаётся константный объект (по значению) и не может избавиться от квалификатора const, что есть хорошо. Неизменяемые объекты должны передаваться по константной ссылке.

Добавлено через 22 секунды
Даже так:
C++
1
bool operator < (const T & other) const
0
no0ker
101 / 88 / 4
Регистрация: 17.12.2010
Сообщений: 416
31.03.2011, 18:08  [ТС] #4
rik_nel, можно ли обойтись без
C++
1
friend
?

Deviaphan, три раза прочитал. ничего не понял. =(

C++
1
2
3
        bool operator < (const T &a) const{
            return Mid() < a.Mid();
        }
вылетает с той же ошибкой
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
31.03.2011, 18:12 #5
Цитата Сообщение от no0ker Посмотреть сообщение
вылетает с той же ошибкой
Mid тоже должна быть константным методом.
1
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
31.03.2011, 22:59 #6
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
#include <vector>
#include <algorithm>
 
using namespace std;
 
class T{
    public:
        T(){}
        T(int a_, int b_) : a(a_), b(b_){}
 
        int Mid() const{
            return (a+b)/2;
        }
    private:
        int a,b;
};
 
bool operator < (const T& other, const T& _other){
  return _other.Mid() < other.Mid();
}
 
int main()
{
    T t1(10, 20), t2(0, 50), t3(100, 200), t4(60, 100);
    vector<T> in;
 
    in.push_back(t1);
    in.push_back(t2);
    in.push_back(t3);
    in.push_back(t4);
 
    sort(in.begin(), in.end()); // вылетает с непонятной ошибкой
    // stl_algo.h|89|error: passing 'const T' as 'this' argument of 'bool T::operator<(T)' discards qualifiers|
 
    return 0;
}
1
no0ker
101 / 88 / 4
Регистрация: 17.12.2010
Сообщений: 416
01.04.2011, 04:51  [ТС] #7
ForEveR, немного не то, как хотелось бы. желательно, что бы оператор "меньше" был переопределен как функция класса. Буду использовать вариант от Deviaphan.
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
01.04.2011, 09:14 #8
no0ker, По идее это нежелательно, т.к. это неверно концептуально. Операторы сравнения делаются в основном вспомогательными функциями.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
01.04.2011, 09:19 #9
Цитата Сообщение от ForEveR Посмотреть сообщение
По идее это нежелательно, т.к. это неверно концептуально
"Концептуальный" смысл в другом. Когда оператор определён как дружественная функция и у класса есть преобразующий конструктор, то можно сравнивать объект данного типа, с объектами совместимого типа. Причём объект может быть как слева, так и справа. Когда оператор определён как метод, то совместимый тип может быть только справа. Т.е. определение его как дружественной функции улучшает функциональность.
Больше никакой разницы нет, только холивар.
0
no0ker
101 / 88 / 4
Регистрация: 17.12.2010
Сообщений: 416
01.04.2011, 11:30  [ТС] #10
ForEveR, не могли бы вы пояснить.
я собираюсь сравнивать объекты одного класса. мне кажется логичным переопределить операторы (для работы с данным классом) в одном месте с самим описанием класса. и ума не приложу, зачем может понадобиться сравнивать объекты разных классов.

Добавлено через 2 минуты

Не по теме:

Deviaphan, вы в своем духе. вроде и слова русские. а вот мысль понять не могу... сложновато что-то.

0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
01.04.2011, 11:44 #11
Немного оффтоп, но я попробую пояснить:
C++
1
2
3
4
5
6
7
8
9
10
11
class A
{
public:
    A( int a );
};
 
bool operator < (const A& L, const A& R );
 
A a;
if( A < 3 ) ...
if( 3 < A ) ...
Т.к. конструктор не explicit, то происходит неявное приведение int(3) к классу A и объект класса А можно сравнить с int. При определении оператора сравнения, как метода класса будет доступен только первый вариант сравнения, в случае функции оба варианта.
Как-то так вот.

Добавлено через 1 минуту
Цитата Сообщение от no0ker Посмотреть сообщение
в одном месте с самим описанием класса
Важно лишь то, чтобы они были в одной области видимости. Всё.

Не по теме:

ОМГ! У меня есть свой, неповторимый, невнятный стить! Я рад.

0
no0ker
101 / 88 / 4
Регистрация: 17.12.2010
Сообщений: 416
01.04.2011, 15:20  [ТС] #12
Важно лишь то, чтобы они были в одной области видимости. Всё.
я имел в виду - удобно при чтения программы. вот описание класса - вот так с ним можно работать - вот так его можно сравнивать - все рядом. глазами не надо бегать. а не в плане корректности компиляции и выполнения.

разве можно привести int к объекту определенного класса? или это просто абстрактный пример?

Не по теме:

ну вот. ввернул слово explicit. теперь разбираться надо... =(

0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
01.04.2011, 15:35 #13
C++
1
2
3
4
5
class Complex
{
public:
    Complex( int a=0, int b=0);
};
Объект класса Complex может быть неявно создан из int

Цитата Сообщение от no0ker Посмотреть сообщение
вот описание класса
Ещё и поэтому выносят функцию сравнения. Она не является описанием класса.)
1
no0ker
101 / 88 / 4
Регистрация: 17.12.2010
Сообщений: 416
01.04.2011, 19:11  [ТС] #14
Deviaphan, мда уж.. после некоторых экспериментов написал код, который очень удивил. и все таки int приводится.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class test{
    public:
        test(int _a=1, int _b=2) : a(_a), b(_b){}
        void show(){
            cout<<a<<" "<<b<<endl;
        }
    private:
        int a, b;
};
 
int main(){
    test t(4, 5);
    int a=3;
 
    t = a;
 
    t.show(); // выводит "3 2"
    return 0;
}
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
01.04.2011, 19:27 #15
Цитата Сообщение от no0ker Посмотреть сообщение
который очень удивил
Ничего удивительного.)
А если пред конструктором напишешь квалификатор explicit, то на строке 15 выдаст ошибку и потребуется явное создание объекта класса Test.
Ещё определи функции сравнения обоими способами (по очереди) и поэкспериментируй с ифом. Чтобы до конца убедиться.)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.04.2011, 19:27
Привет! Вот еще темы с ответами:

Не могу понять почему не работает программа - C++
int f,x,a,b,c; cin&gt;&gt;x; if (x&gt;0) {f=pow(-x,4); cout&lt;&lt;f;} else {f=x+92; cout&lt;&lt;f;} if (x==0) {f=0;

Не могу понять почему не работает прога(структуры) - C++
Вот стрепал код. структура содержит результаты сессии( как раз актуально), надо ввести данные в структуру, фамилии студентов и оценки по...

Не могу понять, почему программа неправильно работает! - C++
Изучаю С++ по Страуструпу Б. - Программирование. Принципы и практика использования C++. Есть задание: 9. Вычислите сумму введенных...

Не могу понять почему программа работает не правильно! - C++
Задание: Программа находит в строке 1 символ который не входит во 2 заданную строку. Помогите исправить ошибку. ...


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

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

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