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

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

02.07.2014, 11:31. Показов 2767. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Не могу понять, почему так нельзя делать (Ошибка: не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору)
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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.07.2014, 11:31
Ответы с готовыми решениями:

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

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

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

Не определяет оператор или преобразование в тип
Не определяет оператор или преобразование в тип: Error 1 error C2676: binary '*' :...

14
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
02.07.2014, 12:00 2
Надо добавить перегрузку префиксного оператора:
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 3
zss, только вот префиксная запись должна (по-хорошему) возвращать ТЕКУЩИЙ объект, а не новый. Который у Вас ещё к тому же почему-то опирается на постфиксную форму (count++). Что тоже не правильно.
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
02.07.2014, 12:16 4
Tulosba, Я не переделывал оператор ТС, а только показал как должен выглядеть такой оператор
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
02.07.2014, 12:21 5
Цитата Сообщение от zss Посмотреть сообщение
Я не переделывал оператор ТС, а только показал как должен выглядеть такой оператор
Он не должен так выглядеть. Но если не касаться тела, то хотя бы с точки зрения сигнатуры. Возвращаться должна ссылка.
0
34 / 34 / 21
Регистрация: 02.02.2012
Сообщений: 181
02.07.2014, 12:27  [ТС] 6
А почему тогда
Цитата Сообщение от TyLinka Посмотреть сообщение
Если создавать объект класса B, то ++x и --x работают нормально.
?
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
02.07.2014, 13:22 7
Справа от операции стоит объект не того типа, который описан в производном классе.
Вот так компилируется
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 8
zss, ну зачем же всё то по ссылке возвращать? Префиксная форма должна возвращать измененный текущий объект (т.е. ссылку на this), а постфиксная форма - состояние объекта до модификации (т.е. копию временного).

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

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

Добавлено через 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 13
Цитата Сообщение от TyLinka Посмотреть сообщение
Это просто тренировочное упражнение из Лафоре
Можно ссылку на издание и страницу?
0
34 / 34 / 21
Регистрация: 02.02.2012
Сообщений: 181
02.07.2014, 16:42  [ТС] 14
Сделала фотку
Р. Лафоре ООП в С++, 4-е издание (Питер)
Миниатюры
Ошибка: не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору  
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
02.07.2014, 18:32 15
Лучший ответ Сообщение было отмечено 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
02.07.2014, 18:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.07.2014, 18:32
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru