Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
71 / 53 / 10
Регистрация: 31.07.2009
Сообщений: 149
1

No operator found which takes a right-hand operand

15.11.2013, 08:57. Показов 2255. Ответов 19
Метки нет (Все метки)

Кто подскажет в чем ошибка?

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)'
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.11.2013, 08:57
Ответы с готовыми решениями:

Binary '==' no operator found which takes a left-hand operand of type 'T'
Здравствуйте. Пытаюсь сравнить элемент массива с объектом,который я создаю в мейн и компилятор...

Error C2679: binary '>>': no operator found which takes a right-hand operand of type
нужно написать программу обработки структур. в программе использовать структуру, содержащую поля с...

Ошибка: error C2679: binary '<<' : no operator found which takes a right-hand operand of type
Нужно создать класс List для представления простого списка. Подскажите, почему появляется такая...

no operator found which takes a right/left-hand operand of type "AR"
Нашел на форуме исходник программы, собрал, но выдает ошибку описанную выше #include &lt;iostream&gt;...

19
Модератор
Эксперт С++
11093 / 9143 / 5494
Регистрация: 18.12.2011
Сообщений: 24,431
15.11.2013, 09:00 2
Для класса LongNumber Вам нужен метод
LongNumber& operator =(LongNumber &);
т.е. возвращающий ссылку на LongNumber
Исправьте строку 106 приведенного кода.
0
71 / 53 / 10
Регистрация: 31.07.2009
Сообщений: 149
15.11.2013, 09:04  [ТС] 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;
    }
0
Модератор
Эксперт С++
11093 / 9143 / 5494
Регистрация: 18.12.2011
Сообщений: 24,431
15.11.2013, 09:13 4
Так должно работать.
Во всяком случае VS 2008 компилирует без ошибок.
0
71 / 53 / 10
Регистрация: 31.07.2009
Сообщений: 149
15.11.2013, 09:16  [ТС] 5
Цитата Сообщение от zss Посмотреть сообщение
Так должно работать.
Во всяком случае VS 2008 компилирует без ошибок.
У меня тоже все работает, но на сайте не проходит почему то из за этой ошибки, там кстати 2010 стоит Visual Studio.
http://acm.timus.ru/problem.aspx?space=1&num=1206

А у меня 2012. Может у кого то есть 2010 и он запустит?
0
Модератор
Эксперт С++
11093 / 9143 / 5494
Регистрация: 18.12.2011
Сообщений: 24,431
15.11.2013, 09:19 6
А попробуйте убрать ссылку!
0
71 / 53 / 10
Регистрация: 31.07.2009
Сообщений: 149
15.11.2013, 09:23  [ТС] 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)'
0
Модератор
Эксперт С++
11093 / 9143 / 5494
Регистрация: 18.12.2011
Сообщений: 24,431
15.11.2013, 09:46 8
Цитата Сообщение от Nikcharn Посмотреть сообщение
argument list '(LongNumber, LongNumber)'
Похоже, компилятору почему-то приспичило operator= считать глобальной
функцией, принимающей 2 параметра типа LongNumber.
Попробуйте!
0
71 / 53 / 10
Регистрация: 31.07.2009
Сообщений: 149
15.11.2013, 14:29  [ТС] 9
Цитата Сообщение от zss Посмотреть сообщение
Похоже, компилятору почему-то приспичило operator= считать глобальной
функцией, принимающей 2 параметра типа LongNumber.
Попробуйте!
А что попробовать?
0
:)
Эксперт С++
4769 / 3263 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
15.11.2013, 14:30 10
Nikcharn, operator= должен принимать const T&. Для этого придется еще методы getNumber() и getSize() сделать константными.
0
71 / 53 / 10
Регистрация: 31.07.2009
Сообщений: 149
15.11.2013, 14:36  [ТС] 11
Цитата Сообщение от Tulosba Посмотреть сообщение
Nikcharn, operator= должен принимать const T&. Для этого придется еще методы getNumber() и getSize() сделать константными.
А можете объяснить почему именно константными?
0
:)
Эксперт С++
4769 / 3263 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
15.11.2013, 14:44 12
Цитата Сообщение от Nikcharn Посмотреть сообщение
А можете объяснить почему именно константными?
Потому что для константного объекта можно вызывать только константные методы.
0
71 / 53 / 10
Регистрация: 31.07.2009
Сообщений: 149
15.11.2013, 15:27  [ТС] 13
Цитата Сообщение от Tulosba Посмотреть сообщение
Потому что для константного объекта можно вызывать только константные методы.
К сожалению та же ошибка.
0
:)
Эксперт С++
4769 / 3263 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
15.11.2013, 15:33 14
Nikcharn, http://ideone.com/EughRa
1
71 / 53 / 10
Регистрация: 31.07.2009
Сообщений: 149
15.11.2013, 15:59  [ТС] 15
Цитата Сообщение от Tulosba Посмотреть сообщение
Ваше, исправление дает ту же самую ошибку.
По-моему тут дело в чем то другом, но блин в голову ничего не лезет.
Сейчас склоняюсь к тому, что может убрать эту перегрузку оператора.
0
:)
Эксперт С++
4769 / 3263 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
15.11.2013, 16:09 16
Цитата Сообщение от Nikcharn Посмотреть сообщение
Ваше, исправление дает ту же самую ошибку.
На VS2010, кстати, всё удачно собирается.
Попробуйте на тимусе выбрать другой компилятор.
0
71 / 53 / 10
Регистрация: 31.07.2009
Сообщений: 149
15.11.2013, 20:08  [ТС] 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 в аргументах.
0
:)
Эксперт С++
4769 / 3263 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
15.11.2013, 20:42 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 в аргументах.
Вы по моей ссылке не ходили что ли? Я же писал об этом.
1
71 / 53 / 10
Регистрация: 31.07.2009
Сообщений: 149
15.11.2013, 20:49  [ТС] 19
Цитата Сообщение от Tulosba Посмотреть сообщение
Вы по моей ссылке не ходили что ли? Я же писал об этом.
Ходил, но я не заметил const в аргументах, а исправил только в 2 методах getSize() и getNumber().

Спасибо.
0
:)
Эксперт С++
4769 / 3263 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
15.11.2013, 20:53 20
Nikcharn, вся суть написана в #10 сообщении. Константные методы это лишь следствие.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.11.2013, 20:53

Ошибка "binary '==': no operator found which takes a left-hand operand of type"
while (currentNode != endNode) { nextNode = path; nextNode1 = path; takeRoute.x =...

Исправить ошибку "error C2679: binary '*' : no operator found which takes a right-hand operand of type"
matiza.h #pragma once template &lt;typename N&gt; class matriza { protected: int stroka; N...

Проверить правильность кода. Вылезает Error 5 error C2679: binary '<<' : no operator found which takes a right
Компилятор ругается на ошибку Error 5 error C2679: binary '&lt;&lt;' : no operator found which takes...

right-hand operand
#include &lt;iostream&gt; #include &lt;cmath&gt; #include &lt;ctime&gt; using namespace std; const int n=3;...


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

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

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