Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337

Перегрузка оператора вывода для шаблонного класса vector<>

22.08.2020, 01:11. Показов 534. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые форумчане! Получается добавлять примитивные типы и выводить их в шаблонном класcе, но когда речь идет о составных типах не получается сделать вывод. Я не знаю как точно перегрузить оператор вывода для моего случая. Помогите, пожауйста, исправить дружественную функцию класса (она перегружает оператор вывода). Вот код:

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
#include <iostream>
 
    using namespace std;
    
struct Person {
    string name;
    int age;
};
 
template <typename T>
    struct Node {
        T key;
        Node* next;
    };
 
template <class T>
    class vec {
        
        private:
 
            Node<T>* head;
 
        public:
 
            void add(T);
            void print();
 
        vec() {
                head = NULL;
            }
 
            ~vec() {
                while (head != NULL) {
                    Node<T>* temp = head->next;
                    delete head;
                    head = temp;
                }
            }
            
        friend ostream& operator<<(ostream &out, const vec &obj) {
            out << obj.name << " " << obj.age;
            return out;
        }
        
    };
 
template <typename T>
    void vec<T>::add(T key) {
        Node<T>* temp = new Node<T>;
        temp->key = key;
        temp->next = NULL;
        if (head == NULL) {
            head = temp;
        } else {
            Node<T>* ptr = head;
            while (ptr->next != NULL) {
                ptr = ptr->next;
            }
            ptr->next = temp;
        }
    }
 
template <typename T>
    void vec<T>::print() {
        if (head != NULL) {
            Node<T>* curr = head;
            while (curr != NULL) {
                cout << curr->key << " ";
                curr = curr->next;
            }
        } else {
            cout << "Empty!\n";
        }
    }
    
int main() {
    Person p = {"Bob", 23 };
    vec<Person> v;
    v.add(p);
    v.print();
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.08.2020, 01:11
Ответы с готовыми решениями:

Перегрузка оператора вывода на консоль для шаблонного класса
Следующий код компилируется, но не линкуется: #include &lt;iostream&gt; using namespace std; template &lt;typename T&gt; class A ...

Перегрузить operator<<() для шаблонного класса (перегрузка оператора вывода)
Здравствуйте. Перегружаю оператор вывода для шаблонного класса. using namespace std; template &lt;class Element&gt; class List { ...

Перегрузка оператора -> для шаблонного класса
Как это написать не понимаю помогите пожалуйста Добавлено через 23 секунды пример кода пожалуйста

4
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
22.08.2020, 01:14
Цитата Сообщение от Fixer_84 Посмотреть сообщение
не получается сделать вывод
Так а зачем вы засунули функцию

C++
1
friend ostream& operator<<(ostream &out, const Person &obj)
внутрь определения класса vec??? Эта функция не имеет никакого отношения к классу vec. Откуда у вас возникла идея поместить ее в определение vec?

---

Я смотрю, вы подправили код. Теперь стало еще хуже. Написана какая-то чушь...
0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
22.08.2020, 01:17  [ТС]
TheCalligrapher, здравствуйте! Спасибо за ваш ответ. Я просто никогда не перегружал операторы вывода для шаблонного класса. Что нужно сделать, чтобы
C++
1
cout << curr->key << " ";
выводила добавленный объект? Помогите, пожалуйста, разобраться.

Добавлено через 1 минуту
TheCalligrapher, для примитивных типов вывод срабатывает, а для составных уже нет.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
22.08.2020, 01:18
Цитата Сообщение от Fixer_84 Посмотреть сообщение
Я просто никогда не перегружал операторы вывода для шаблонного класса.
Где вы здесь увидели "перегрузку операторов вывода для шаблонного класса"? У вас вывод шаблонного класса делается методом print. Никакой перегрузки операторов для шаблонного класса у вас в коде нет.

Цитата Сообщение от Fixer_84 Посмотреть сообщение
чтобы выводила добавленный объект?
Надо написать оператор

C++
1
ostream& operator<<(ostream &out, const Person &obj)
И у вас это было сделано правильно в исходном варианте кода. Только определение этого оператора вы засунули не туда.

А теперь вы все "исправили" и получилась полная бессмысленная дичь.
1
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
22.08.2020, 01:22  [ТС]
TheCalligrapher, спасибо вам. Я давно не работал с классами на C++. Вот рабочий вариант кода.

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
#include <iostream>
 
    using namespace std;
    
struct Person {
    
    string name;
    int age;
    
    friend ostream& operator<<(ostream &out, const Person &obj) {
        out << obj.name << " " << obj.age;
        return out;
    }
};
 
template <typename T>
    struct Node {
        T key;
        Node* next;
    };
 
template <class T>
    class vec {
        
        private:
 
            Node<T>* head;
 
        public:
 
            void add(T);
            void print();
 
        vec() {
                head = NULL;
            }
 
            ~vec() {
                while (head != NULL) {
                    Node<T>* temp = head->next;
                    delete head;
                    head = temp;
                }
            }
    };
 
template <typename T>
    void vec<T>::add(T key) {
        Node<T>* temp = new Node<T>;
        temp->key = key;
        temp->next = NULL;
        if (head == NULL) {
            head = temp;
        } else {
            Node<T>* ptr = head;
            while (ptr->next != NULL) {
                ptr = ptr->next;
            }
            ptr->next = temp;
        }
    }
 
template <typename T>
    void vec<T>::print() {
        if (head != NULL) {
            Node<T>* curr = head;
            while (curr != NULL) {
                cout << curr->key << " ";
                curr = curr->next;
            }
        } else {
            cout << "Empty!\n";
        }
    }
    
int main() {
    Person p = {"Bob", 23 };
    vec<Person> v;
    v.add(p);
    v.print();
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.08.2020, 01:22
Помогаю со студенческими работами здесь

Перегрузка оператора -> для шаблонного класса
Здравствуйте! Возникла проблема: не могу додуматься как перегрузить оператор -&gt; так, чтобы он корректно работал. Вот код: ...

Перегрузка оператора для разных типов данных шаблонного класса
Создаю оператор инкремента. Как создать отдельный оператор инкремента для каждого типа объекта класса? Если допустим у меня будут несколько...

Перегрузка оператора << шаблонного класса
Всем доброго времени суток! Целый день бьюсь над перегрузкой оператора &lt;&lt; в шаблонном классе одномерный массив. Пока получилось родить...

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

Перегрузка [][] для шаблонного класса
КАК перегрузка для шаблонного класса template&lt;class ITEM&gt; SmartArray2d&lt;ITEM&gt;::SmartArray2d(const int m, const int n) noexcept :...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
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