С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
TyLinka
32 / 32 / 11
Регистрация: 02.02.2012
Сообщений: 177
#1

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

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

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

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

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

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

Каким образом работает побитовое или и для чего этот оператор используется в заданном фрагменте кода? - C++
Добрый день, не сможете объяснить, каким образом работает побитовый оператор или в данном цикле и для чего он нужен? Заранее благодарен за...

Выражение должно относиться к целочисленному типу или типу перечисления без области видимости - C++
Добрый день,столкнулся с проблемой &quot;Выражение должно относиться к целочисленному типу или типу перечисления без области видимости&quot; в такой...

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

Добавлено через 1 минуту
TyLinka, что Вы вообще хотите сделать? Для какой цели наследование? Есть какая-то четко поставленная задача?
1
zss
Модератор
Эксперт С++
6579 / 6141 / 2023
Регистрация: 18.12.2011
Сообщений: 16,004
Завершенные тесты: 1
02.07.2014, 15:03 #9
Tulosba, класс разрабатывается новый. Поэтому можно возвращать все, что угодно
в соответствии с желанием разработчика.
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
02.07.2014, 15:22 #10
Цитата Сообщение от zss Посмотреть сообщение
в соответствии с желанием разработчика.
Если желание разработчика противоречит общепринятым концепциям в данной сфере - то это плохой разработчик.
Можно ведь и сложение перегрузить чтоб оно диск форматировало, но зачем это называть тогда "сложением"?
0
zss
Модератор
Эксперт С++
6579 / 6141 / 2023
Регистрация: 18.12.2011
Сообщений: 16,004
Завершенные тесты: 1
02.07.2014, 15:35 #11
Цитата Сообщение от Tulosba Посмотреть сообщение
но зачем это называть тогда "сложением"?
Это будет "сложение дисков в мусорку".

Кстати, постфиксную операцию в соответствии со стандартными взглядами реализовать, по моему, нельзя.
Т.к. не понимаю, как переданный неизмененный объект потом изменить.
0
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);  // проблемное место
Не очень понятно, но работает
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
02.07.2014, 16:33 #13
Цитата Сообщение от TyLinka Посмотреть сообщение
Это просто тренировочное упражнение из Лафоре
Можно ссылку на издание и страницу?
0
TyLinka
32 / 32 / 11
Регистрация: 02.02.2012
Сообщений: 177
02.07.2014, 16:42  [ТС] #14
Сделала фотку
Р. Лафоре ООП в С++, 4-е издание (Питер)
0
Миниатюры
Ошибка: не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору  
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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;
}
2
02.07.2014, 18:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.07.2014, 18:32
Привет! Вот еще темы с ответами:

Выражение должно относиться к целочисленному типу или типу перечисления без области видимости - C++
#include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; int main() { int N; double Y = 0; setlocale(0,&quot;&quot;); cout &lt;&lt;...

2IntelliSense: выражение должно относиться к целочисленному типу или типу перечисления без области видимости - C++
&quot;Выражение должно относиться к целочисленному типу или типу перечисления без области видимости&quot; Что это за ошибка такая и как ее исправить?...

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

1C 8.x (тонкий) Ошибка: Преобразование значения к типу Число не может быть выполнено - 1С
Пытаюсь провести начисления по книге Радченко, написал алгоритм формирования различных видов расчетов в общем модуле, и при попытке...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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