Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
qwestcl
10 / 10 / 1
Регистрация: 30.09.2012
Сообщений: 172
#1

Шаблоны перегрузка ввода/вывода - C++

09.11.2013, 00:28. Просмотров 1086. Ответов 7
Метки нет (Все метки)

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
#include <iostream>
#include <assert.h>
#include <stdlib.h>
 
using namespace std;
 
template <class T> class Array {
    friend ostream &operator<<(ostream &, const Array <T> &);
    friend istream &operator >>(istream &, Array<T>&);
public:
    Array(int = 10);
    ~Array();
private:
    T *ptr; //указатель на 1й элемент
    int size; //размер массива
    //    static
};
 
template <class T> Array<T>::Array(int arraySize) {
    size = arraySize;
    ptr = new T[size];
    assert(ptr != 0); //завершить, если память не выделена
}
 
template <class T> Array<T>::~Array() {
    delete [] ptr;
}
 
template <class T> istream& operator>> (istream& in,  Array<T>& x) {
    for (int i = 0; i < x.size; ++i) {
        in >> x.ptr[i];
    }
    return in;
}
 
template <class T> ostream& operator << (ostream & out, const Array<T> &x) {
    for (int i = 0; i < x.size; ++i) {
        out << x.ptr[i] << " ";
 
    }
    return out;
}
 
int main() {
    Array<int> a(5);
    cin >> a;
    cout << a;
 
    return 0;
}
Ошибки:
C++ (Qt)
1
2
3
4
D:\ProgQt\untitled0-build-desktop-Qt_4_8_0_for_Desktop_-_MinGW__Qt_SDK_________\..\untitled0\main.cpp:8: предупреждение: friend declaration 'std::ostream& operator<<(std::ostream&, const Array<T>&)' declares a non-template function
D:\ProgQt\untitled0-build-desktop-Qt_4_8_0_for_Desktop_-_MinGW__Qt_SDK_________\..\untitled0\main.cpp:9: предупреждение: friend declaration 'std::istream& operator>>(std::istream&, Array<T>&)' declares a non-template function
D:\ProgQt\untitled0-build-desktop-Qt_4_8_0_for_Desktop_-_MinGW__Qt_SDK_________\..\untitled0\main.cpp:48: ошибка: undefined reference to `operator>>(std::istream&, Array<int>&)'
D:\ProgQt\untitled0-build-desktop-Qt_4_8_0_for_Desktop_-_MinGW__Qt_SDK_________\..\untitled0\main.cpp:49: ошибка: undefined reference to `operator<<(std::ostream&, Array<int> const&)'
В первых, вроде как жалуется на то, что это не шаблонная ф-ция, хотя вроде сделано все так.
Буду благодарен за помощь в перегрузке ввода/вывода для шаблонного класса!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.11.2013, 00:28     Шаблоны перегрузка ввода/вывода
Посмотрите здесь:

Перегрузка вывода и ввода - C++
Здравствуйте прошу помочь ,написал программу в ней нужно перегрузить вывод и ввод ,как это можно осуществить??пробовал перегружать...

Перегрузка операции ввода/вывода - C++
В лабораторной говорится: &quot;Перегрузить операции ввода и вывода 2 способами: внутренним и внешним&quot;. Что такое внешним я представляю, а...

Перегрузка оператора ввода вывода - C++
Есть два хэдера(header.h и Array.h) и исполняемая программа main.cpp в которой я как раз и обращаюсь к оператору ввода Array.h ...

Перегрузка оператора ввода ,вывода - C++
Вообщем проблема такая есть класс в нем приват поля и перегружены 2 дружественных оператора ввода вывода, все хорошо, но дружественный...

Перегрузка операторов ввода и вывода - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; class ComplexNumber { private: double a, b; ...

Перегрузка потока ввода-вывода - C++
Подскажите как правильно перегружать потоки, вот что я делал и какие ошибки появились Как правильно перегружать потоки записи и чтения в...

Перегрузка операторов ввода\вывода - C++
Вот такой простенький пример описан во многих постах, есть в некоторых видео но у меня в компиляторе mvs 2015, при компиляции выдает...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
13063 / 7326 / 817
Регистрация: 27.09.2012
Сообщений: 18,085
Записей в блоге: 3
Завершенные тесты: 1
09.11.2013, 00:32     Шаблоны перегрузка ввода/вывода #2
C++
1
2
3
4
    template < typename U >
    friend ostream &operator<<(ostream &, const Array <U> &);
    template < typename U >
    friend istream &operator >>(istream &, Array<U>&);
qwestcl
10 / 10 / 1
Регистрация: 30.09.2012
Сообщений: 172
09.11.2013, 00:36  [ТС]     Шаблоны перегрузка ввода/вывода #3
C++
1
2
3
4
5
6
...
template <class T> class Array {
    template <class T> friend ostream &operator<< (ostream &, const Array<T> &x);
    template <class T> friend istream &operator >> (istream &, Array<T>&x);
public:
...
Errors:
C++ (Qt)
1
2
D:\ProgQt\untitled0-build-desktop-Qt_4_8_0_for_Desktop_-_MinGW__Qt_SDK_________\..\untitled0\main.cpp:8: ошибка: declaration of 'class T'
D:\ProgQt\untitled0-build-desktop-Qt_4_8_0_for_Desktop_-_MinGW__Qt_SDK_________\..\untitled0\main.cpp:7: error:  shadows template parm 'class T'
gray_fox
What a waste!
1449 / 1178 / 61
Регистрация: 21.04.2012
Сообщений: 2,466
Завершенные тесты: 3
09.11.2013, 00:40     Шаблоны перегрузка ввода/вывода #4
qwestcl, http://ideone.com/8KttXe
Croessmah
Модератор
Эксперт CЭксперт С++
13063 / 7326 / 817
Регистрация: 27.09.2012
Сообщений: 18,085
Записей в блоге: 3
Завершенные тесты: 1
09.11.2013, 00:46     Шаблоны перегрузка ввода/вывода #5
Цитата Сообщение от qwestcl Посмотреть сообщение
Errors:
Имя параметра шаблона поменяйте у friend функций тогда.
gray_fox
What a waste!
1449 / 1178 / 61
Регистрация: 21.04.2012
Сообщений: 2,466
Завершенные тесты: 3
09.11.2013, 00:51     Шаблоны перегрузка ввода/вывода #6
Кстати
Цитата Сообщение от qwestcl Посмотреть сообщение
C++
1
2
ptr = new T[size];
assert(ptr != 0); //завершить, если память не выделена
new никогда не вернёт 0; если память не получиться выделить будет выброшен std::bad_alloc; 0 может вернуть nothrow new
C++
1
2
3
4
5
#include <new>
 
// ...
 
ptr = new (std::nothrow) T[size];
qwestcl
10 / 10 / 1
Регистрация: 30.09.2012
Сообщений: 172
09.11.2013, 00:59  [ТС]     Шаблоны перегрузка ввода/вывода #7
Цитата Сообщение от Croessmah Посмотреть сообщение
Имя параметра шаблона поменяйте у friend функций тогда.
Спасибо, помогло. Но почему нужно использовать разные имена? И, насколько я знаю, разницы между class и typename нет, по крайней мере в моем примере.
gray_fox, спасибо, пример так же работает, но:
friend ostream & operator << <>(ostream &, const Array<T> &);
friend istream & operator >> <>(istream &, Array<T> &);
что это(<>) такое? кстати, qt его подчеркивает как ошибку, но все нормально компилирует, странно. не могли бы вы поснить?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2013, 01:06     Шаблоны перегрузка ввода/вывода
Еще ссылки по теме:

Перегрузка операторов ввода/вывода. - C++
Класс комплексных чисел. Нужно чтобы программа выводила и вводила в таком виде (функции in и out): #include &lt;iostream&gt; #include...

Перегрузка операций ввода/вывода - C++
Всем доброго времени суток! Подскажите, в чем ошибка - есть класс, в котором присутствуют 2 функции-друга, которые перегружают операции...

Перегрузка операторов ввода и вывода - C++
Добрый вечер! Помогите с задачкой.Я создал класс очередь и класс массив очередей.задача готова, но препод потребовал перегрузить оператор...

Перегрузка операторов ввода/вывода - C++
Вроде сделал, но не работает перегрузка оператора ввода. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; ...

Перегрузка операторов ввода-вывода - C++
Доброго времени суток! Почему перестал работать &gt;&gt; оператор для стандартного типа char. Перегруженная операция cin&gt;&gt;one возвращает все...


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

Или воспользуйтесь поиском по форуму:
gray_fox
What a waste!
1449 / 1178 / 61
Регистрация: 21.04.2012
Сообщений: 2,466
Завершенные тесты: 3
09.11.2013, 01:06     Шаблоны перегрузка ввода/вывода #8
Цитата Сообщение от qwestcl Посмотреть сообщение
что это(<>) такое?
Явное указание, что это специализация шаблона функции.

Добавлено через 2 минуты
Т.е. тут объявляется другом не шаблон ф-ии (как у Croessmah), а только его специализация для типа T.
Yandex
Объявления
09.11.2013, 01:06     Шаблоны перегрузка ввода/вывода
Ответ Создать тему
Опции темы

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