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

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

Восстановить пароль Регистрация
 
TyLinka
32 / 32 / 11
Регистрация: 02.02.2012
Сообщений: 177
02.07.2014, 11:31     Ошибка: не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору #1
Здравствуйте!
Не могу понять, почему так нельзя делать (Ошибка: не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору)
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 работают нормально.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.07.2014, 11:31     Ошибка: не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору
Посмотрите здесь:

что происходит со старым конструктором когда я создаю новый, пренадлежащий производному типу? (первый конструктор пренадлежит базовому типу) C++
C++ String^ что этот оператор значит?
sizeof к объекту или типу? C++
ошибки "Complex" не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору C++
C++ Оператор if и указатель на цикл (ввод цифр и преобразование в буквы)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 1
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--);
    }
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
02.07.2014, 12:06     Ошибка: не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору #3
zss, только вот префиксная запись должна (по-хорошему) возвращать ТЕКУЩИЙ объект, а не новый. Который у Вас ещё к тому же почему-то опирается на постфиксную форму (count++). Что тоже не правильно.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 1
02.07.2014, 12:16     Ошибка: не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору #4
Tulosba, Я не переделывал оператор ТС, а только показал как должен выглядеть такой оператор
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
02.07.2014, 12:21     Ошибка: не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору #5
Цитата Сообщение от zss Посмотреть сообщение
Я не переделывал оператор ТС, а только показал как должен выглядеть такой оператор
Он не должен так выглядеть. Но если не касаться тела, то хотя бы с точки зрения сигнатуры. Возвращаться должна ссылка.
TyLinka
32 / 32 / 11
Регистрация: 02.02.2012
Сообщений: 177
02.07.2014, 12:27  [ТС]     Ошибка: не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору #6
А почему тогда
Цитата Сообщение от TyLinka Посмотреть сообщение
Если создавать объект класса B, то ++x и --x работают нормально.
?
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 1
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;
}
Но такой нюанс, мне кажется, зависит от компилятора.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
02.07.2014, 14:05     Ошибка: не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору #8
zss, ну зачем же всё то по ссылке возвращать? Префиксная форма должна возвращать измененный текущий объект (т.е. ссылку на this), а постфиксная форма - состояние объекта до модификации (т.е. копию временного).

Добавлено через 1 минуту
TyLinka, что Вы вообще хотите сделать? Для какой цели наследование? Есть какая-то четко поставленная задача?
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 1
02.07.2014, 15:03     Ошибка: не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору #9
Tulosba, класс разрабатывается новый. Поэтому можно возвращать все, что угодно
в соответствии с желанием разработчика.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
02.07.2014, 15:22     Ошибка: не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору #10
Цитата Сообщение от zss Посмотреть сообщение
в соответствии с желанием разработчика.
Если желание разработчика противоречит общепринятым концепциям в данной сфере - то это плохой разработчик.
Можно ведь и сложение перегрузить чтоб оно диск форматировало, но зачем это называть тогда "сложением"?
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 1
02.07.2014, 15:35     Ошибка: не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору #11
Цитата Сообщение от Tulosba Посмотреть сообщение
но зачем это называть тогда "сложением"?
Это будет "сложение дисков в мусорку".

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

Добавлено через 10 минут
Цитата Сообщение от zss Посмотреть сообщение
C++
1
2
++static_cast<B>(x);  // проблемное место
--static_cast<B>(x);  // проблемное место
Не очень понятно, но работает
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
02.07.2014, 16:33     Ошибка: не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору #13
Цитата Сообщение от TyLinka Посмотреть сообщение
Это просто тренировочное упражнение из Лафоре
Можно ссылку на издание и страницу?
TyLinka
32 / 32 / 11
Регистрация: 02.02.2012
Сообщений: 177
02.07.2014, 16:42  [ТС]     Ошибка: не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору #14
Сделала фотку
Р. Лафоре ООП в С++, 4-е издание (Питер)
Миниатюры
Ошибка: не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.07.2014, 18:32     Ошибка: не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору
Еще ссылки по теме:

Оператор if или где скрыта ошибка C++
Операторы эквивалентные оператору присваивания\условному оператору? C++
C++ Выражение должно относиться к целочисленному типу или типу перечисления без области видимости

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
02.07.2014, 18:32     Ошибка: не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору #15
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Могу предложить такое решение:
Кликните здесь для просмотра всего текста
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;
}
Yandex
Объявления
02.07.2014, 18:32     Ошибка: не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору
Ответ Создать тему
Опции темы

Текущее время: 23:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru