Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
34 / 34 / 21
Регистрация: 02.02.2012
Сообщений: 181

Ошибка: не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору

02.07.2014, 11:31. Показов 3158. Ответов 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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <iostream>
 
using namespace std;
 
class A
{
protected:
    int count;
public:
    A(): count(0)
    {   }
    A(int x): count(x)
    {   }
    int get()
    {
        return count;
    }
    A operator++ ()
    {
        return ++count;
    }
};
class B : public A
{
public:
    B(): A()
    {   }
    B(int x): A(x)
    {   }
    B operator-- ()
    {
        return B(--count);
    }
};
class C : public B
{
public:
    C(): B()
    {   }
    C(int x): B(x)
    {   }
    C operator++ (int)
    {
        return C(count++);
    }
    C operator-- (int)
    {
        return C(count--);
    }
};
int main()
{
    C x;
    x++;
    x++;
    x--;
    ++x;   // проблемное место
    --x;  // проблемное место
    cout << x.get();
}
Если создавать объект класса B, то ++x и --x работают нормально.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.07.2014, 11:31
Ответы с готовыми решениями:

ошибки "Complex" не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору
заголовочный файл #include &lt;iostream&gt; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; using namespace...

C2676. Бинарный "++": не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору
Учу C++ по книге, в конце главы есть задание: написать функцию подсчета символов к классу Document. Не работает переход по итераторам. Не...

бинарный "++": "Counter" не определяет этот оператор или преобразование к типу приемлемо к встроенному
бинарный &quot;++&quot;: &quot;Counter&quot; не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору #include...

14
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,246
02.07.2014, 12:00
Надо добавить перегрузку префиксного оператора:
C++
1
2
3
4
5
6
7
8
C operator++ ()
    {
        return C(count++);
    }
    C operator-- ()
    {
        return C(count--);
    }
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
02.07.2014, 12:06
zss, только вот префиксная запись должна (по-хорошему) возвращать ТЕКУЩИЙ объект, а не новый. Который у Вас ещё к тому же почему-то опирается на постфиксную форму (count++). Что тоже не правильно.
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,246
02.07.2014, 12:16
Tulosba, Я не переделывал оператор ТС, а только показал как должен выглядеть такой оператор
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
02.07.2014, 12:21
Цитата Сообщение от zss Посмотреть сообщение
Я не переделывал оператор ТС, а только показал как должен выглядеть такой оператор
Он не должен так выглядеть. Но если не касаться тела, то хотя бы с точки зрения сигнатуры. Возвращаться должна ссылка.
0
34 / 34 / 21
Регистрация: 02.02.2012
Сообщений: 181
02.07.2014, 12:27  [ТС]
А почему тогда
Цитата Сообщение от TyLinka Посмотреть сообщение
Если создавать объект класса B, то ++x и --x работают нормально.
?
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,246
02.07.2014, 13:22
Справа от операции стоит объект не того типа, который описан в производном классе.
Вот так компилируется
C++
1
2
 ++static_cast<B>(x);   // проблемное место
    --static_cast<B>(x);  // проблемное место
Если объявить оба оператора в базовом классе, то тоже все получится
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
class A
{
protected:
    int count;
public:
    A(): count(0)
    {   }
    A(int x): count(x)
    {   }
    int get()
    {
        return count;
    }
    A& operator++ ()
    {
        ++count;
        return *this;
    }
   A& operator++ (int)
    {
        ++count;
        return *this;
    }
   A& operator-- ()
    {
        --count;
        return *this;
    }
   A& operator-- (int)
    {
        --count;
        return *this;
    }
};
class B : public A
{
public:
    B(): A()
    {   }
    B(int x): A(x)
    {   }
};
class C : public B
{
public:
    C(): B()
    {   }
    C(int x): B(x)
    {   }
};
int main()
{
    C x;
    x++;
    x--;
    ++x;   // проблемное место
    --x;  // проблемное место
    cout << x.get();
    _getch();
    return 0;
}
Но такой нюанс, мне кажется, зависит от компилятора.
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
02.07.2014, 14:05
zss, ну зачем же всё то по ссылке возвращать? Префиксная форма должна возвращать измененный текущий объект (т.е. ссылку на this), а постфиксная форма - состояние объекта до модификации (т.е. копию временного).

Добавлено через 1 минуту
TyLinka, что Вы вообще хотите сделать? Для какой цели наследование? Есть какая-то четко поставленная задача?
1
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,246
02.07.2014, 15:03
Tulosba, класс разрабатывается новый. Поэтому можно возвращать все, что угодно
в соответствии с желанием разработчика.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
02.07.2014, 15:22
Цитата Сообщение от zss Посмотреть сообщение
в соответствии с желанием разработчика.
Если желание разработчика противоречит общепринятым концепциям в данной сфере - то это плохой разработчик.
Можно ведь и сложение перегрузить чтоб оно диск форматировало, но зачем это называть тогда "сложением"?
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,246
02.07.2014, 15:35
Цитата Сообщение от Tulosba Посмотреть сообщение
но зачем это называть тогда "сложением"?
Это будет "сложение дисков в мусорку".

Кстати, постфиксную операцию в соответствии со стандартными взглядами реализовать, по моему, нельзя.
Т.к. не понимаю, как переданный неизмененный объект потом изменить.
0
34 / 34 / 21
Регистрация: 02.02.2012
Сообщений: 181
02.07.2014, 16:25  [ТС]
Это просто тренировочное упражнение из Лафоре, где, используя наследование, необходимо добавить возможность использования постфиксных операций для случаев уменьшения и увеличения счетчика. Отсылают к примеру, где были даны классы А и В.

Добавлено через 10 минут
Цитата Сообщение от zss Посмотреть сообщение
C++
1
2
++static_cast<B>(x);  // проблемное место
--static_cast<B>(x);  // проблемное место
Не очень понятно, но работает
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
02.07.2014, 16:33
Цитата Сообщение от TyLinka Посмотреть сообщение
Это просто тренировочное упражнение из Лафоре
Можно ссылку на издание и страницу?
0
34 / 34 / 21
Регистрация: 02.02.2012
Сообщений: 181
02.07.2014, 16:42  [ТС]
Сделала фотку
Р. Лафоре ООП в С++, 4-е издание (Питер)
Миниатюры
Ошибка: не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору  
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
02.07.2014, 18:32
Лучший ответ Сообщение было отмечено TyLinka как решение

Решение

Могу предложить такое решение:
Кликните здесь для просмотра всего текста
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
#include <iostream>
 
class PrefixCounter
{
public:
    PrefixCounter(int cnt=0) : cnt_(cnt) {}
    virtual ~PrefixCounter() {}
    int getCounter() const { return cnt_; }
    PrefixCounter& operator--() { --cnt_; return *this; }
    PrefixCounter& operator++() { ++cnt_; return *this; }
protected:
    void setCounter(int cnt) { cnt_=cnt; }
private:    
    int cnt_;
};
 
class AnyCounter : public PrefixCounter
{
public:
    using PrefixCounter::operator--;
    using PrefixCounter::operator++;
    AnyCounter(int cnt=0) : PrefixCounter(cnt) {}
    AnyCounter operator--(int) { 
        AnyCounter ac(getCounter());
        --(*this);
        return ac;
    }
    AnyCounter operator++(int) {
        AnyCounter ac(getCounter());
        ++(*this);
        return ac;
    }
};
 
int main() {
 
    AnyCounter ac;
    
    ++ac;
    ac++;
    
    std::cout << ac.getCounter() << std::endl;
 
    --ac;
    ac--;
    
    std::cout << ac.getCounter() << std::endl;  
    return 0;
}
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.07.2014, 18:32
Помогаю со студенческими работами здесь

Не определяет оператор или преобразование в тип
Не определяет оператор или преобразование в тип: Error 1 error C2676: binary '*' : 'System::EventArgs ^' does not define this operator...

Ошибка C2676 бинарный "[": "matr" не определяет этот оператор
Компилятор возмущается:( Выдает ошибки: отсутствует оператор &quot;&quot;, соответствующий этим операндам Ошибка C2676 бинарный &quot;#include...

Как привести объект пользовательского типа к заданному встроенному типу?
Добрый вечер, у меня есть класс: ref class MessageClass { public: char *senderName; short sizeMessage; char *message;

Ошибка: Преобразование значения к типу Число не может быть выполнено
Пытаюсь провести начисления по книге Радченко, написал алгоритм формирования различных видов расчетов в общем модуле, и при попытке...

1с ошибка Преобразование значения к типу Число не может быть выполнено
Всем привет! Учусь 1с по книге Радченко &quot;Практическое пособие разработчика&quot;. Застрял на примере расчета зарплаты. При...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 30.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru