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

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

Восстановить пароль Регистрация
 
qwestcl
10 / 10 / 1
Регистрация: 30.09.2012
Сообщений: 172
09.11.2013, 00:28     Шаблоны перегрузка ввода/вывода #1
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&)'
В первых, вроде как жалуется на то, что это не шаблонная ф-ция, хотя вроде сделано все так.
Буду благодарен за помощь в перегрузке ввода/вывода для шаблонного класса!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11838 / 6817 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 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!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
09.11.2013, 00:40     Шаблоны перегрузка ввода/вывода #4
qwestcl, http://ideone.com/8KttXe
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11838 / 6817 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
09.11.2013, 00:46     Шаблоны перегрузка ввода/вывода #5
Цитата Сообщение от qwestcl Посмотреть сообщение
Errors:
Имя параметра шаблона поменяйте у friend функций тогда.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 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++ Перегрузка операций ввода/вывода
Перегрузка операторов ввода вывода C++
Перегрузка потокового ввода-вывода C++

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

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

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

Текущее время: 18:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru