Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
тыжПрограммист
 Аватар для LonerZzz
330 / 144 / 44
Регистрация: 21.04.2014
Сообщений: 638

Шаблоны и перегрузка различных операторов

09.01.2015, 00:01. Показов 2032. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не могу правильно описать шаблон при перегрузке операторов. Добился того,что не видит ошибок..но при компиляции ругается и выдаёт кракозярбы.

Array.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#pragma once
template<class T> class Array
{
public:
 
    friend istream &operator>>  (istream &, const Array<T> &);
    friend ostream &operator<<  (ostream &, const Array<T> &);
    
    T *Arr;
    int count;
 
    Array();
    Array(int);
    Array(const Array &);
    ~Array();
    void Input();
    void Output();
    //const Array &operator= (const int &);
    const Array &operator* (const T &);
    T &operator[] (int);
};
Array.cpp
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
#include "stdafx.h"
#include "Array.h"
 
 
template<class T> Array<T>::Array()
{
    ++count;
    Arr = new T[count];
    Arr[0] = 0;
}
 
template<class T> Array<T> ::Array(int COUNT)
{
 
    if (COUNT <= 0) exit(1);
    else
    {
        Arr = new T[COUNT];
        count = COUNT;
        for (int i = 0; i < count; ++i)
            Arr[i] = 0;
    }
 
}
 
template<class T> Array<T>::Array(const Array &newArray)
:count(newArray.count)        
{
    Arr = new T[count];
 
    for (int i = 0; i < count; ++i)
        Arr[i] = newArray.Arr[i];
}
 
 
template<class T> Array<T>::~Array()
{
    delete[] Arr;
}
 
 
template<class T> istream &operator>> (istream & input, const Array<T> &ARRAY)
{
    for (int i = 0; i < ARRAY.count; ++i)
        input >> ARRAY.Arr[i];
    return input;
}
 
template<class T> ostream &operator<< (ostream &output, const Array<T> &ARRAY)
{
    for (int i = 0; i < ARRAY.count; ++i)
    {
        output << std::setw(3)
            << ARRAY.Arr[i];
    }
    output << std::endl;
 
    return output;
}
 
 
template<class T>  const Array<T> &Array<T>::operator* (const T &MN)
{
    for (int i = 0; i < count; ++i)
    {
        Arr[i] *= MN;
    }
 
    return *this;
}
 
template<class T> T &Array<T>::operator[] (int INDEX)
{
    if (INDEX < 0 || INDEX >= count)
        exit(1);
 
    return Arr[INDEX];
}
 
template<class T> void Array<T>::Input()
{
    for (int i = 0; i < count; ++i)
        cin >> Arr[i];
}
 
template<class T> void Array<T>::Output()
{
    for (int i = 0; i < count; ++i)
        cout << setw(3) << Arr[i]; 
 
    cout << std::endl;
}

main.cpp
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
// TEMPLATE.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include "Array.h"
 
 
int _tmain(int argc, _TCHAR* argv[])
{
     Array <int> arr1(3);
     Array <int> arr2(3);
    arr1.Input();
    arr2.Input();
    //arr1[2] = 3;
    cout << arr1 << std::endl;
    cout << arr2 << std::endl;
 
    arr1 = arr1 * 3;
    arr2 = arr2 * 0;
 
    cout << arr1 << std::endl;
    cout << arr2 << std::endl;
 
    system("pause");
    return 0;
}
Перегрузить нужно оператор *,<< >>. Без шаблонов программа работала..а с шаблонами где-то накосячил
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.01.2015, 00:01
Ответы с готовыми решениями:

Перегрузка операторов и шаблоны
#include &lt;iostream&gt; using namespace std; template &lt;class X, int size&gt; class type { X mas; public: type() { for(int i =...

Шаблоны классов, перегрузка операторов
Задание:Реализовать шаблон классов Array. Перегрузить операторы присваивания =, ввода &gt;&gt; и вывода &lt;&lt; (предусмотреть обработку...

Перегрузка операторов через шаблоны
Есть класс дробь, переопределил операторы (внутри класса). В таком случае (дробь оператор что-то) работает, но (что-то оператор дробь) -...

8
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
09.01.2015, 00:13
Лучший ответ Сообщение было отмечено LonerZzz как решение

Решение

Цитата Сообщение от LonerZzz Посмотреть сообщение
Добился того,что не видит ошибок..но при компиляции ругается
Или не видит ошибок, или ругается при компиляции. Должно быть что-то одно.
При инстанцировании шаблона (в main()) компилятор должен видеть реализацию шаблона. Перемести её в .h файл.
1
тыжПрограммист
 Аватар для LonerZzz
330 / 144 / 44
Регистрация: 21.04.2014
Сообщений: 638
09.01.2015, 00:20  [ТС]
Цитата Сообщение от lss Посмотреть сообщение
Должно быть что-то одно.
Я не правильно сказал..При линковке ругается).

Цитата Сообщение от lss Посмотреть сообщение
При инстанцировании шаблона (в main()) компилятор должен видеть реализацию шаблона. Перемести её в .h файл.
Вот оно как...Хорошо что сюда написал..сам в жизни бы не догадался...Ну и ересь
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
09.01.2015, 00:30
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
#pragma once
#include <iostream>
#include <iomanip>
 
template<class T> class Array;
 
template<class T>
std::istream &operator>>  (std::istream &, const Array<T> &);
template<class T>
std::ostream &operator<<  (std::ostream &, const Array<T> &);
 
template<class T> class Array
{
public:
 
    friend std::istream &operator>> <T> (std::istream &, const Array<T> &);
    friend std::ostream &operator<< <T> (std::ostream &, const Array<T> &);
    
    T *Arr;
    int count;
 
    Array();
    Array(int);
    Array(const Array &);
    ~Array();
    void Input();
    void Output();
    //const Array &operator= (const int &);
    const Array &operator* (const T &);
    T &operator[] (int);
};
 
template<class T> Array<T>::Array()
{
    ++count;
    Arr = new T[count];
    Arr[0] = 0;
}
 
template<class T> Array<T> ::Array(int COUNT)
{
 
    if (COUNT <= 0) exit(1);
    else
    {
        Arr = new T[COUNT];
        count = COUNT;
        for (int i = 0; i < count; ++i)
            Arr[i] = 0;
    }
 
}
 
template<class T> Array<T>::Array(const Array &newArray)
:count(newArray.count)        
{
    Arr = new T[count];
 
    for (int i = 0; i < count; ++i)
        Arr[i] = newArray.Arr[i];
}
 
 
template<class T> Array<T>::~Array()
{
    delete[] Arr;
}
 
 
template<class T> std::istream &operator>> (std::istream & input, const Array<T> &ARRAY)
{
    for (int i = 0; i < ARRAY.count; ++i)
        input >> ARRAY.Arr[i];
    return input;
}
 
template<class T> std::ostream &operator<< (std::ostream &output, const Array<T> &ARRAY)
{
    for (int i = 0; i < ARRAY.count; ++i)
    {
        output << std::setw(3)
            << ARRAY.Arr[i];
    }
    output << std::endl;
 
    return output;
}
 
 
template<class T>  const Array<T> &Array<T>::operator* (const T &MN)
{
    for (int i = 0; i < count; ++i)
    {
        Arr[i] *= MN;
    }
 
    return *this;
}
 
template<class T> T &Array<T>::operator[] (int INDEX)
{
    if (INDEX < 0 || INDEX >= count)
        exit(1);
 
    return Arr[INDEX];
}
 
template<class T> void Array<T>::Input()
{
    for (int i = 0; i < count; ++i)
        std::cin >> Arr[i];
}
 
template<class T> void Array<T>::Output()
{
    for (int i = 0; i < count; ++i)
        cout << setw(3) << Arr[i]; 
 
    cout << std::endl;
}
 
int main()
{
     Array <int> arr1(3);
     Array <int> arr2(3);
    arr1.Input();
    arr2.Input();
    //arr1[2] = 3;
    std::cout << arr1 << std::endl;
    std::cout << arr2 << std::endl;
 
    arr1 = arr1 * 3;
    arr2 = arr2 * 0;
 
    std::cout << arr1 << std::endl;
    std::cout << arr2 << std::endl;
 
    system("pause");
    return 0;
}
Миниатюры
Шаблоны и перегрузка различных операторов  
1
тыжПрограммист
 Аватар для LonerZzz
330 / 144 / 44
Регистрация: 21.04.2014
Сообщений: 638
09.01.2015, 00:35  [ТС]
Можно было так не утруждать себя. Достаточно было того,что вы сказали выше)..Спасибо ещё раз
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
09.01.2015, 00:39
Если сделать только то, что я написал во втором посте, то код всё равно не скомпилируется.
1
тыжПрограммист
 Аватар для LonerZzz
330 / 144 / 44
Регистрация: 21.04.2014
Сообщений: 638
09.01.2015, 00:41  [ТС]
Цитата Сообщение от lss Посмотреть сообщение
то код всё равно не скомпилируется
Думаю..рано или поздно исправил бы..а вот насчёт того,что нужно нужно реализацию в h файл закинуть я не знал.
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
09.01.2015, 00:48
Цитата Сообщение от LonerZzz Посмотреть сообщение
Думаю..рано или поздно исправил бы
Наверное, но дружественный шаблонный метод для шаблонного класса - не самый простой случай.
1
тыжПрограммист
 Аватар для LonerZzz
330 / 144 / 44
Регистрация: 21.04.2014
Сообщений: 638
09.01.2015, 00:59  [ТС]
Цитата Сообщение от lss Посмотреть сообщение
Наверное, но дружественный шаблонный метод для шаблонного класса - не самый простой случай.
пришлось бы попотеть..в любом случае есть рабочий код,который мне помог..помог мне ..поможет и другим. Хорошим делом занимаетесь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.01.2015, 00:59
Помогаю со студенческими работами здесь

Шаблоны классов, перегрузка операторов, C2679
#include &lt;iostream&gt;//для std::cin, std::cout #include &lt;cstdio&gt; #include &lt;string&gt; #include &lt;cstdlib&gt; using namespace std; class...

Что такое "перегрузка операторов"? Каковы принципы работы перегруженных операторов и назначение указателя this
Добрый день . Помогите понять принцип работы перегрузки операторов. объясните пожалуйста в зависимости от чего зависит агрумент при...

Перегрузка и шаблоны
Для каждого пункта задания создать: 1. Перегружаемые функции для типов int и double 2. Шаблоны функций Все необходимые данные для...

Перегрузка оператора [] и шаблоны.
Всем доброго времени суток! Проблема такая: есть класс сVector template &lt;class T, int Size&gt; class cVector { T *m_data; ...

Перегрузка и шаблоны функций
Добрый день. Приведенную нижу задачу нужно оформить в виде шаблонов функций. В одномерном массиве, состоящем из n вещественных элементов,...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru