Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
 Аватар для Cortas
223 / 150 / 79
Регистрация: 14.03.2016
Сообщений: 459

Ошибка в перегрузке operator=

11.04.2018, 22:46. Показов 1377. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток! Компилятор ругается на перегрузку оператора присвоения. Задумывалось так, что in[i] возвращает ссылку на объект T, т.е. конечный тип должен быть просто Т. Это конечное значение должно копироваться в массив, однако при взятии i-того элемента, компилятор пытается взаимодействовать с левой частью выражения. Что с этим делать?

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
#include <iostream>
#include <conio.h>
#include <stdlib.h>
using namespace std;
 
int end()
{
    cout << endl << "END" << endl;
    _getch();
    return 0;
}
 
template <typename T>
class _array
{
private:
    T *arr;
    int arr_size;
public:
    _array() { arr = nullptr; arr_size = 0; }
 
    _array(const _array<T>& in)
    {
        *this = in;
        /*arr_size = in.size();
        arr = new T[arr_size];
        for (int i = in.arr_size - 1; i >= 0; i--)
            arr[i] = in[i];*/
    }
    
    ~_array() { clear(); }
    
    _array& operator=(const _array<T>& in)
    {
        clear();
        arr_size = in.arr_size;
        arr = new T[arr_size];
        for (int i = in.arr_size - 1; i >= 0; i--)
            arr[i] = in[i]; //C2678 бинарный "[": не найден оператор, принимающий левый операнд типа "const _array<int>" (или приемлемое преобразование отсутствует)
 
        return *this;
    }
 
    T& operator[](const int& i)
    {
        return arr[i];
    }
 
    void clear()
    { 
        if (arr_size)
        {
            arr_size = 0;
            delete[] arr;
            arr = nullptr;
        }
    }
 
    int size()
    {
        return arr_size;
    }
};
 
int main()
{
    _array<int> a;
    _array<int> b; 
    b = a;
 
    return end();
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.04.2018, 22:46
Ответы с готовыми решениями:

Ошибка в перегрузке метода operator<
main.cpp #include &lt;iostream&gt; #include &quot;addressBook.h&quot; int main(){ // AddressBook book;

Ошибка при перегрузке "operator ==" в классе
Если объявляю operator== в классе, то ошибка слишком много параметров для функции оператора #include &lt;iostream&gt; class...

Ошибка в перегрузке
Заголовок #ifndef CHALLENGE_H #define CHALLENGE_H #include &lt;ostream&gt; using std::ostream; class Stringos { friend...

5
5 / 5 / 6
Регистрация: 23.03.2018
Сообщений: 98
11.04.2018, 23:17
Cortas, а что это все делает?
0
 Аватар для Cortas
223 / 150 / 79
Регистрация: 14.03.2016
Сообщений: 459
11.04.2018, 23:27  [ТС]
perevertysh,
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
#include <iostream>
#include <conio.h>
#include <stdlib.h>
using namespace std;
 
int end()//чтобы консоль не вылетала при окончании программы
{
    cout << endl << "END" << endl;
    _getch();
    return 0;
}
 
template <typename T>
class _array  //Шаблонный класс 
{
private:
    T *arr;   //Указатель на будущий массив 
    int arr_size; //Размер массива 
public:
    _array() { arr = nullptr; arr_size = 0; } //Пустой конструктор 
 
    _array(const _array<T>& in) //Конструктор, который копирует объект такого же класс
    {
        *this = in;
        /*arr_size = in.size();
        arr = new T[arr_size];
        for (int i = in.arr_size - 1; i >= 0; i--)
            arr[i] = in[i];*/
    }
    
    ~_array() { clear(); } //Деконструктор, очищающий память
    
    _array& operator=(const _array<T>& in) //Перегрузка оператора присваивания
    {
        clear();  //Очищаем все, что сейчас имеем
        arr_size = in.arr_size;  //меняем размер 
        arr = new T[arr_size];  //Выделяем новую память
        for (int i = in.arr_size - 1; i >= 0; i--) //По элементное копирование с другого объекта того же класса
            arr[i] = in[i]; //C2678 бинарный "[": не найден оператор, принимающий левый операнд типа "const _array<int>" (или приемлемое преобразование отсутствует)
 
        return *this;
    }
 
    T& operator[](const int& i) //Перегрузка кв. скобок, возвращающая ссылку на i-тый элемент массива
    {
        return arr[i];
    }
 
    void clear() //Функция, очищающая память
    { 
        if (arr_size) //Проверка нужно чтобы не пытаться очистить не распределенный участок памяти
        {
            arr_size = 0; //обнуляем размер
            delete[] arr; //Удаляем память под массив
            arr = nullptr; //Ставим указатель в "ноль"
        }
    }
 
    int size() //Метод, возвращающий текущий размер массива
    {
        return arr_size;
    }
};
 
int main()
{
    _array<int> a; //Объявление пустого объекта a
    _array<int> b; //Объявление пустого объекта b
    b = a; //Присваивание b a
 
    return end();
}
0
5 / 5 / 6
Регистрация: 23.03.2018
Сообщений: 98
11.04.2018, 23:31
Cortas, да не, я в плане: какая задача в ходе программы выполняется?
0
 Аватар для Cortas
223 / 150 / 79
Регистрация: 14.03.2016
Сообщений: 459
11.04.2018, 23:35  [ТС]
perevertysh, иметь возможно скопировать имеющийся объект, в другой объект. Для этого я и перегрузил operator=.
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
11.04.2018, 23:43
Лучший ответ Сообщение было отмечено Cortas как решение

Решение

ну замени
C++
1
2
3
4
 T& operator[](const int& i) //Перегрузка кв. скобок, возвращающая ссылку на i-тый элемент массива
    {
        return arr[i];
    }
на это:
C++
1
2
3
4
5
6
7
8
    T operator [](int i)const
    {
        return arr[i];
    }
    T & operator[](int i)
    {
        return arr[i];
    }
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.04.2018, 23:43
Помогаю со студенческими работами здесь

Ошибка при перегрузке +
Что не так? error C2601: Matrica::operator +: недопустимые локальные определения функций #pragma once class Matrica { public: ...

Ошибка в перегрузке операций
Долго сижу и никак не могу понять в чём ошибка. Вот 3 файла. Они подключены правильно и работают. main.cpp #include &lt;iostream&gt;...

Ошибка в перегрузке оператора
Не пойму в чем дело(( Имеется класс вектор ,вычислил длину,а теперь очу сравнить их величины,но не могу составить данный оператор выдает...

Ошибка в перегрузке оператора +=
#include &lt;iostream.h&gt; #include &lt;string.h&gt; #include &lt;windows.h&gt; const int da=256; class stroki { public: stroki(); ...

Ошибка в перегрузке операторов?
не могу понять в чем ошибка class cMatrix { private: int rows; int columns; public:


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru