Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
4 / 4 / 0
Регистрация: 20.07.2018
Сообщений: 279

Структура как тип данных для шаблона

15.09.2022, 17:54. Показов 1761. Ответов 14

Студворк — интернет-сервис помощи студентам
Здравствуйте. Допустим у меня есть некая структура:
C++
1
2
3
4
struct Point {
    int x;
    int y;
};
И есть шаблонный класс, который должен работать со всеми типами данных, в том числе и с этой структурой. Тогда как передать эту структуру в качестве типа данных для этого шаблона? Если я просто пишу:
C++
1
some_class<Point> obj1;
то программа не компилируется. Как можно это исправить?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.09.2022, 17:54
Ответы с готовыми решениями:

Как ограничить тип данных шаблона класса?
Решил создать два класса: умный массив и его менеджер. Так как массив может хранить любые типы, то его сделал шаблоном: template...

Как узнать тип данных шаблона функции?
Я старался делать так: #include&lt;iostream&gt; #include&lt;fstream&gt; #include&lt;conio.h&gt; #include&lt;stdlib.h&gt; #include&lt;string&gt; using namespace...

Параметр шаблона класса как собственный тип данных
Приветствую. Такой вопрос: как перегрузить операторы класса-шаблона, где в качестве аргумента шаблона выступает собственный тип данных....

14
2393 / 1920 / 763
Регистрация: 27.07.2012
Сообщений: 5,562
15.09.2022, 18:01
_lUserl_, "не компилируется" - это не описание проблемы. Что пишет компилятор?

В общем же случае, шаблоны не работают с абсолютно любыми типами. Всегда есть какие-то ограничения, которые типы параметры шаблона должны соблюдать.
0
4 / 4 / 0
Регистрация: 20.07.2018
Сообщений: 279
15.09.2022, 18:08  [ТС]
Цитата Сообщение от John Prick Посмотреть сообщение
Что пишет компилятор?
error: no matching function for call to 'matrix<Point>::matrix(int, int, int)' и так далее для любых методов класса

Добавлено через 4 минуты
Как я понимаю, нужно дополнительно написать отдельные методы для случая, когда в качестве параметра передается структура? Тогда как понять, что структура была передана?
0
2393 / 1920 / 763
Регистрация: 27.07.2012
Сообщений: 5,562
15.09.2022, 18:14
Цитата Сообщение от _lUserl_ Посмотреть сообщение
error: no matching function for call to 'matrix<Point>::matrix(int, int, int)' и так далее для любых методов класса
Ну вот уже некий matrix<> объявился. Приведите описание класса. Будет понятно, предназначен ли он для работы с Point.
Цитата Сообщение от _lUserl_ Посмотреть сообщение
Как я понимаю, нужно дополнительно написать отдельные методы для случая, когда в качестве параметра передается структура? Тогда как понять, что структура была передана?
Опять же в общем случае никакого дополнительного кода не нужно. Это же шаблон. Хотя, конечно, ситуации бывают разные.
0
 Аватар для programmer_08
687 / 444 / 209
Регистрация: 18.10.2020
Сообщений: 1,606
15.09.2022, 18:18
_lUserl_, киньте весь код, это же не таинство какое-то
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,221
15.09.2022, 18:44
Цитата Сообщение от _lUserl_ Посмотреть сообщение
error: no matching function for call to 'matrix<Point>::matrix(int, int, int)' и так далее для любых методов класса
Вы хотите сказать, что вам это выдается на

C++
1
some_class<Point> obj1;
?

Цитата Сообщение от _lUserl_ Посмотреть сообщение
Как я понимаю, нужно дополнительно написать отдельные методы для случая, когда в качестве параметра передается структура?
С чего бы это вдруг? Может надо, может не надо... Откуда ж нам знать? И что такое "дополнительно написать отдельные методы"?
0
4 / 4 / 0
Регистрация: 20.07.2018
Сообщений: 279
15.09.2022, 19:15  [ТС]
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include "header.h"
using namespace std;
struct Point {
 
int x;
 
};
int main()
{
 
    matrix<Point> m1(5, 5, 1);
    matrix<int> m2(5,2, 2);
    matrix<int> m3;
 
    m3 = m1.mul(m2);
    m2.printMatrix();
    m1.printMatrix();
    m3.printMatrix();
    return 0;
}
header.h
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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#ifndef HEADER_H_INCLUDED
#define HEADER_H_INCLUDED
#include <iostream>
using namespace std;
 
template<class T> class matrix{
private:
    int i;
    int j;
    T **arr;
 
public:
    matrix(size_t row, size_t col, const T& value);
    matrix();
    matrix(const matrix& some_matrix);
    T get(int row, int col);
    void set(int row, int col, const T& value);
    void printMatrix();
    int rows();
    int columns();
    matrix& operator=(const matrix& some_matrix);
    matrix mul(const matrix& some_matrix);
    ~matrix();
};
 
template<class T> matrix<T>::matrix(size_t row, size_t col, const T& value){
    i = row;
    j = col;
    arr = new T* [i];
    for(int I = 0; I < i; I++)
        arr[I] = new T [j];
 
    for (int ii = 0; ii < i; ii++){
        for (int jj = 0; jj < j; jj++) {
            arr[ii][jj] = value;
        }
    }
}
template<class T> matrix<T>::matrix(){
    i = 5;
    j = 5;
 
    arr = new T* [i];
    for(int I = 0; I < i; I++)
        arr[I] = new T [j];
 
    for (int ii = 0; ii < i; ii++){
        for (int jj = 0; jj < j; jj++) {
            arr[ii][jj] = 0;
        }
    }
}
template<class T> matrix<T>::matrix(const matrix& some_matrix){
    i = some_matrix.i;
    j = some_matrix.j;
 
    arr = new T* [i];
    for(int I = 0; I < i; I++)
        arr[I] = new T [j];
 
    for (int ii = 0; ii < i; ii++){
        for (int jj = 0; jj < j; jj++) {
            arr[ii][jj] = some_matrix.arr[ii][jj];
        }
    }
}
 
template<class T> matrix<T>::~matrix() {
    for(int ii=0; ii < i; ii++)
        delete [] arr[ii];
    delete [] arr;
}
 
template<class T> T matrix<T>::get(int row, int col) {
 
    try {
        if(row > i || row < 0)
            throw 1;
        if(col > j || col < 0)
            throw 2;
        return arr[row][col];
    }
    catch(int err){
        cout << "Error number " << err << endl;
        return -1;
    }
 
}
 
template<class T> void matrix<T>::set(int row, int col, const T& value) {
 
    try{
        if(row > i || row < 0)
            throw 1;
        if(col > j || col < 0)
            throw 2;
        arr[row][col] = value;
    }
    catch(int err) {
        cout << "Error number " << err << endl;
    }
}
 
template<class T> void matrix<T>::printMatrix() {
 
    cout << "Matrix: " << endl;
    for (int row = 0; row < i; row++) {
        for (int col = 0; col < j; col++) {
            cout << arr[row][col] << " ";
        }
        cout << endl;
    }
}
 
template<class T> int matrix<T>::rows(){
    return i;
}
 
template<class T> int matrix<T>::columns(){
    return j;
}
 
template<class T> matrix<T>& matrix<T>::operator=(const matrix& some_matrix){
 
    for(int ii=0; ii < i; ii++)
        delete [] arr[ii];
    delete [] arr;
 
    i = some_matrix.i;
    j = some_matrix.j;
 
    arr = new T* [i];
    for(int I = 0; I < i; I++)
        arr[I] = new T [j];
 
    for (int ii = 0; ii < i; ii++){
        for (int jj = 0; jj < j; jj++) {
            arr[ii][jj] = some_matrix.arr[ii][jj];
        }
    }
    return *this;
}
 
template<class T> matrix<T> matrix<T>::mul(const matrix& some_matrix) {
 
    matrix<T> C(i, some_matrix.j, 0);
    //T tmp = 0;
 
    try {
        if(j != some_matrix.i)
            throw 1;
        for (int row = 0; row < i; row++){
            for (int col = 0; col < some_matrix.j; col++) {
                C.arr[row][col] = 0;
                //if(some_matrix.j > j)
                  //  tmp = some_matrix.j - j;
                for (int k = 0; k < j; k++)
                    C.arr[row][col] += arr[row][k] * some_matrix.arr[k][col];
            }
        }
    }
    catch(int err){
        cout << "Error number " << err << endl;
    }
    return C;
}
 
 
#endif // HEADER_H_INCLUDED
Вот код

Добавлено через 1 минуту
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Вы хотите сказать, что вам это выдается на
Конечно нет, это был лишь пример.
Эта ошибка выдается вот тут:
C++
1
matrix<Point> m1(5, 5, 1);
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,221
15.09.2022, 19:19
Цитата Сообщение от _lUserl_ Посмотреть сообщение
matrix<Point> m1(5, 5, 1);
Так этот конструктор класса Matrix у вас ожидает размеры матрицы и начальное значение типа Point для элементов матрицы.

Вы же передаете в него 1 в качестве начального значения. Что вы хотели этим получить? Какую матрицу вы хотели получить? Что такое 1? Какое отношение 1 имеет к Point?
0
2393 / 1920 / 763
Регистрация: 27.07.2012
Сообщений: 5,562
15.09.2022, 19:21
_lUserl_, ну и что значит эта "1" в вызове конструктора, который ожидает const T&, т.е. const Point& ?
0
4 / 4 / 0
Регистрация: 20.07.2018
Сообщений: 279
15.09.2022, 19:23  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Какое отношение 1 имеет к Point?
Вот именно что никакое, хотелось бы разобраться как в принципе передать Point в качестве параметра шаблона.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что вы хотели этим получить?
Впринципе ничего, я просто вместо int'a написал Point, чтобы посмотреть какие ошибки я получу
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,221
15.09.2022, 19:29
Цитата Сообщение от _lUserl_ Посмотреть сообщение
Вот именно что никакое, хотелось бы разобраться как в принципе передать Point в качестве параметра шаблона.
"Point в качестве параметра шаблона" вы уже передали. Все получилось. А эта ошибка не имеет никакого отношения к "передать Point в качестве параметра шаблона".

Цитата Сообщение от _lUserl_ Посмотреть сообщение
Впринципе ничего, я просто вместо int'a написал Point, чтобы посмотреть какие ошибки я получу
Ну вот и получили. Там, где вы забыли исправить int на Point у вас, разумеется, полезли ошибки.
0
4 / 4 / 0
Регистрация: 20.07.2018
Сообщений: 279
15.09.2022, 19:31  [ТС]
Сделал так:

C++
1
2
3
4
5
6
7
8
9
10
    Point m;
    matrix<Point> m1(5, 5, m);
   // matrix<int> m2(5,2, 2);
    //matrix<int> m3;
 
    //m3 = m1.mul(m2);
    //m2.printMatrix();
    m1.printMatrix();
    //m3.printMatrix();
    return 0;
Теперь же получил такую ошибку:
error: no match for 'operator<<' (operand types are 'std::ostream {aka std::basic_ostream<char>}' and 'Point')|

в этом методе:
C++
1
2
3
4
5
6
7
8
9
10
template<class T> void matrix<T>::printMatrix() {
 
    cout << "Matrix: " << endl;
    for (int row = 0; row < i; row++) {
        for (int col = 0; col < j; col++) {
            cout << arr[row][col] << " ";
        }
        cout << endl;
    }
}
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,221
15.09.2022, 19:37
Лучший ответ Сообщение было отмечено _lUserl_ как решение

Решение

Цитата Сообщение от _lUserl_ Посмотреть сообщение
Сделал так:
C++
1
2
    Point m;
    matrix<Point> m1(5, 5, m)
... при этом у вас значение m (а значит и изначальная матрица) содержит мусор.

Вместо того, чтобы гонять туда-сюда мусор, можно было сделать так

C++
1
2
Point m{};
matrix<Point> m1(5, 5, m);
или короче

C++
1
matrix<Point> m1(5, 5, {});
Это заполнит матрицу элементами Point с нулевыми координатами.

Или так

C++
1
matrix<Point> m1(5, 5, { 10, 20 });

Цитата Сообщение от _lUserl_ Посмотреть сообщение
Теперь же получил такую ошибку:
error: no match for 'operator<<' (operand types are 'std::ostream {aka std::basic_ostream<char>}' and 'Point')|
Это не удивительно. Ваш тип Point не поддерживает вывод в поток через оператор <<. Опять же, к шаблону matrix эта проблема не имеет никакого отношения.

Хотите чтобы ваш тип Point поддерживал вывод в поток - пишите для него такую поддержку вывода через оператор <<.
0
4 / 4 / 0
Регистрация: 20.07.2018
Сообщений: 279
15.09.2022, 19:53  [ТС]
TheCalligrapher, сделал так:
C++
1
2
3
4
5
6
7
8
struct Point {
 
    int x;
    friend ostream& operator<<(ostream& out, Point& p) {
        out << p.x;
        return out;
    }
};
Получилось. Спасибо
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,221
15.09.2022, 19:55
Цитата Сообщение от _lUserl_ Посмотреть сообщение
friend ostream& operator<<(ostream& out, Point& p) {
friend ostream& operator<<(ostream& out, const Point& p)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.09.2022, 19:55
Помогаю со студенческими работами здесь

Структура, как тип контейнеров данных
Доброго времени суток. Возможно ли использование структуры, в качестве типа данных &lt;T&gt; контейнеров, таких, как QList&lt;T&gt; или...

Тип данных как структура с функциями
Тип многочлен от одной переменной, задаваемый степенью многочлена и массивом коэффициентов. Предусмотреть операцию вычитания . Как...

Как указать тип аргумента шаблона для функции?
#include &lt;iostream&gt; #include &lt;windows.h&gt; #include &lt;vector&gt; #include &lt;stdexcept&gt; #include &lt;algorithm&gt; using namespace std; ...

Как разместить в заголовочном файле функцию, которой на вход подается свой тип данных (структура)?
Только начал С изучать. Я понимаю что ей не нравится (по тексту ошибки), но не знаю как это исправить. Подскажите как это сделать по...

Структура файлов для шаблона
Добрый день. Как лучше начинать писать сайт, чтоб он формировался из 3х отдельных частей: шапка, тело и футер или имел однофайловую...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru