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

No operator found which takes a right-hand operand - C++

Восстановить пароль Регистрация
 
Nikcharn
 Аватар для Nikcharn
71 / 53 / 3
Регистрация: 31.07.2009
Сообщений: 149
15.11.2013, 08:57     No operator found which takes a right-hand operand #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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#include <iostream>
#include <vector>
 
class LongNumber
{
public:
    
    LongNumber()
    {
    }
 
    LongNumber(std::vector <int> a)
    {
        box.resize(a.size());
        for (int i = 0; i < a.size(); i++)
        {
            box[i] = a[i];
        }
    }
 
    void pushBack(int number)
    {
        box.push_back(number);
    }
 
    int getSize()
    {
        return box.size();
    }
 
    int getNumber(int pos)
    {
        return box[pos];
    }
    
    void reverseUp()
    {
        int condition = box.size() / 2;
        int glass, last = box.size() - 1;
 
        for (int i = 0; i < condition; i++)
        {
            glass = box[i];
            box[i] = box[last - i];
            box[last - i] = glass;
        }
    }
 
    void reverseBack()
    {
        int condition = box.size() / 2;
        int glass, last = box.size() - 1;
 
        for (int i = 0; i < condition; i++)
        {
            glass = box[i];
            box[i] = box[last - i];
            box[last - i] = glass;
        }
    }
 
    void print()
    {
        int pos = 0;
        
        while (!box[pos])
        {
            pos++;
        }
        
        for (int i = pos; i < box.size(); i++)
        {
            std::cout << box[i];
        }
    }
 
    LongNumber operator* (LongNumber & obj)
    {
        int length = box.size() + obj.getSize() + 1;
        std::vector <int> c;
        c.resize(length);
 
        for (int i = 0; i < box.size(); i++)
        {
            for (int j = 0; j < obj.getSize(); j++)
            {
                c[i + j] += box[i] * obj.getNumber(j);
            }
        }
 
        for (int i = 0; i < c.size() - 1; i++)
        {
            c[i+1] +=  c[i] / 10;
            c[i] =  c[i] % 10;
        }
        
        int last = c.size() - 1;
 
        while (!c[last])
            last--;
        c.resize(last + 1);
        return LongNumber(c);
    }
 
    LongNumber &operator= (LongNumber &obj)
    {
 
        box.resize(obj.getSize());
 
        for (int i = 0; i < obj.getSize(); i++)
        {
            box[i] = obj.getNumber(i);
        }
 
        return *this;
    }
 
private:
    std::vector <int> box;
};
 
int main()
{
    int k;
    std::cin >> k;
    
    LongNumber a, b, c;
    a.pushBack(5);
    a.pushBack(5);
    b.pushBack(3);
    b.pushBack(6);
    c.pushBack(1);
 
    a.reverseUp();
    b.reverseUp();
 
    for (int i = 0; i < k - 1; i++ )
    {
        c = c * a;
    }
    
    c = c * b;
 
    c.reverseBack();
    c.print();
    
    
}
error C2679: binary '=' : no operator found which takes a right-hand operand of type 'LongNumber' (or there is no acceptable conversion)
fd738c-suxzyq(105): could be 'LongNumber LongNumber::operator =(LongNumber &)'
while trying to match the argument list '(LongNumber, LongNumber)'
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2013, 08:57     No operator found which takes a right-hand operand
Посмотрите здесь:

операторы hand made C++
C++ no overloaded function takes 3 arguments
C++ right-hand operand
operator char() или operator int() C++
no operator found which takes a right/left-hand operand of type "AR" C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5946 / 5551 / 1784
Регистрация: 18.12.2011
Сообщений: 14,175
Завершенные тесты: 1
15.11.2013, 09:00     No operator found which takes a right-hand operand #2
Для класса LongNumber Вам нужен метод
LongNumber& operator =(LongNumber &);
т.е. возвращающий ссылку на LongNumber
Исправьте строку 106 приведенного кода.
Nikcharn
 Аватар для Nikcharn
71 / 53 / 3
Регистрация: 31.07.2009
Сообщений: 149
15.11.2013, 09:04  [ТС]     No operator found which takes a right-hand operand #3
Цитата Сообщение от zss Посмотреть сообщение
Для класса LongNumber Вам нужен метод
LongNumber& operator =(LongNumber &);
т.е. возвращающий ссылку на LongNumber
А чем этот не подходит?
C++
1
2
3
4
5
6
7
8
9
10
11
12
LongNumber &operator= (LongNumber &obj)
    {
 
        box.resize(obj.getSize());
 
        for (int i = 0; i < obj.getSize(); i++)
        {
            box[i] = obj.getNumber(i);
        }
 
        return *this;
    }
zss
Модератор
Эксперт С++
 Аватар для zss
5946 / 5551 / 1784
Регистрация: 18.12.2011
Сообщений: 14,175
Завершенные тесты: 1
15.11.2013, 09:13     No operator found which takes a right-hand operand #4
Так должно работать.
Во всяком случае VS 2008 компилирует без ошибок.
Nikcharn
 Аватар для Nikcharn
71 / 53 / 3
Регистрация: 31.07.2009
Сообщений: 149
15.11.2013, 09:16  [ТС]     No operator found which takes a right-hand operand #5
Цитата Сообщение от zss Посмотреть сообщение
Так должно работать.
Во всяком случае VS 2008 компилирует без ошибок.
У меня тоже все работает, но на сайте не проходит почему то из за этой ошибки, там кстати 2010 стоит Visual Studio.
http://acm.timus.ru/problem.aspx?space=1&num=1206

А у меня 2012. Может у кого то есть 2010 и он запустит?
zss
Модератор
Эксперт С++
 Аватар для zss
5946 / 5551 / 1784
Регистрация: 18.12.2011
Сообщений: 14,175
Завершенные тесты: 1
15.11.2013, 09:19     No operator found which takes a right-hand operand #6
А попробуйте убрать ссылку!
Nikcharn
 Аватар для Nikcharn
71 / 53 / 3
Регистрация: 31.07.2009
Сообщений: 149
15.11.2013, 09:23  [ТС]     No operator found which takes a right-hand operand #7
Цитата Сообщение от zss Посмотреть сообщение
А попробуйте убрать ссылку!
Попробовал, та же ошибка, но без ссылки:
error C2679: binary '=' : no operator found which takes a right-hand operand of type 'LongNumber' (or there is no acceptable conversion)
iadtgn-ux8wko(105): could be 'LongNumber LongNumber::operator =(LongNumber &)'
while trying to match the argument list '(LongNumber, LongNumber)'
zss
Модератор
Эксперт С++
 Аватар для zss
5946 / 5551 / 1784
Регистрация: 18.12.2011
Сообщений: 14,175
Завершенные тесты: 1
15.11.2013, 09:46     No operator found which takes a right-hand operand #8
Цитата Сообщение от Nikcharn Посмотреть сообщение
argument list '(LongNumber, LongNumber)'
Похоже, компилятору почему-то приспичило operator= считать глобальной
функцией, принимающей 2 параметра типа LongNumber.
Попробуйте!
Nikcharn
 Аватар для Nikcharn
71 / 53 / 3
Регистрация: 31.07.2009
Сообщений: 149
15.11.2013, 14:29  [ТС]     No operator found which takes a right-hand operand #9
Цитата Сообщение от zss Посмотреть сообщение
Похоже, компилятору почему-то приспичило operator= считать глобальной
функцией, принимающей 2 параметра типа LongNumber.
Попробуйте!
А что попробовать?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
15.11.2013, 14:30     No operator found which takes a right-hand operand #10
Nikcharn, operator= должен принимать const T&. Для этого придется еще методы getNumber() и getSize() сделать константными.
Nikcharn
 Аватар для Nikcharn
71 / 53 / 3
Регистрация: 31.07.2009
Сообщений: 149
15.11.2013, 14:36  [ТС]     No operator found which takes a right-hand operand #11
Цитата Сообщение от Tulosba Посмотреть сообщение
Nikcharn, operator= должен принимать const T&. Для этого придется еще методы getNumber() и getSize() сделать константными.
А можете объяснить почему именно константными?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
15.11.2013, 14:44     No operator found which takes a right-hand operand #12
Цитата Сообщение от Nikcharn Посмотреть сообщение
А можете объяснить почему именно константными?
Потому что для константного объекта можно вызывать только константные методы.
Nikcharn
 Аватар для Nikcharn
71 / 53 / 3
Регистрация: 31.07.2009
Сообщений: 149
15.11.2013, 15:27  [ТС]     No operator found which takes a right-hand operand #13
Цитата Сообщение от Tulosba Посмотреть сообщение
Потому что для константного объекта можно вызывать только константные методы.
К сожалению та же ошибка.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
15.11.2013, 15:33     No operator found which takes a right-hand operand #14
Nikcharn, http://ideone.com/EughRa
Nikcharn
 Аватар для Nikcharn
71 / 53 / 3
Регистрация: 31.07.2009
Сообщений: 149
15.11.2013, 15:59  [ТС]     No operator found which takes a right-hand operand #15
Цитата Сообщение от Tulosba Посмотреть сообщение
Ваше, исправление дает ту же самую ошибку.
По-моему тут дело в чем то другом, но блин в голову ничего не лезет.
Сейчас склоняюсь к тому, что может убрать эту перегрузку оператора.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
15.11.2013, 16:09     No operator found which takes a right-hand operand #16
Цитата Сообщение от Nikcharn Посмотреть сообщение
Ваше, исправление дает ту же самую ошибку.
На VS2010, кстати, всё удачно собирается.
Попробуйте на тимусе выбрать другой компилятор.
Nikcharn
 Аватар для Nikcharn
71 / 53 / 3
Регистрация: 31.07.2009
Сообщений: 149
15.11.2013, 20:08  [ТС]     No operator found which takes a right-hand operand #17
Если кому то интересно, решил проблему так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
LongNumber &operator= (const LongNumber &obj)
    {
 
        box.resize(obj.getSize());
 
        for (int i = 0; i < obj.getSize(); i++)
        {
            box[i] = obj.getNumber(i);
        }
 
        return *this;
    }
Поставил const перед LongNumber в аргументах.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
15.11.2013, 20:42     No operator found which takes a right-hand operand #18
Цитата Сообщение от Nikcharn Посмотреть сообщение
Если кому то интересно, решил проблему так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
LongNumber &operator= (const LongNumber &obj)
    {
 
        box.resize(obj.getSize());
 
        for (int i = 0; i < obj.getSize(); i++)
        {
            box[i] = obj.getNumber(i);
        }
 
        return *this;
    }
Поставил const перед LongNumber в аргументах.
Вы по моей ссылке не ходили что ли? Я же писал об этом.
Nikcharn
 Аватар для Nikcharn
71 / 53 / 3
Регистрация: 31.07.2009
Сообщений: 149
15.11.2013, 20:49  [ТС]     No operator found which takes a right-hand operand #19
Цитата Сообщение от Tulosba Посмотреть сообщение
Вы по моей ссылке не ходили что ли? Я же писал об этом.
Ходил, но я не заметил const в аргументах, а исправил только в 2 методах getSize() и getNumber().

Спасибо.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2013, 20:53     No operator found which takes a right-hand operand
Еще ссылки по теме:

Error: ambiguous overload for 'operator<<' (operand types are 'std::ofstream {aka std::basic_ofstream<char>}' C++
Ошибка: macro "double" passed 2 arguments but takes just 1 C++
Реализация operator + через operator += C++

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
15.11.2013, 20:53     No operator found which takes a right-hand operand #20
Nikcharn, вся суть написана в #10 сообщении. Константные методы это лишь следствие.
Yandex
Объявления
15.11.2013, 20:53     No operator found which takes a right-hand operand
Ответ Создать тему
Опции темы

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