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

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

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

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

09.11.2013, 00:28. Просмотров 1096. Ответов 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&)'
В первых, вроде как жалуется на то, что это не шаблонная ф-ция, хотя вроде сделано все так.
Буду благодарен за помощь в перегрузке ввода/вывода для шаблонного класса!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.11.2013, 00:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Шаблоны перегрузка ввода/вывода (C++):

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

Перегрузка ввода/вывода в/из потока - C++
Никогда потоками не пользовался, поэтому не знаю. Как перегрузить для ввода из потока оператор operator &gt;&gt;? Как перегрузить для вывода в...

Перегрузка операторов ввода вывода - C++
в .h файле сделал объявление inline ostream&amp; operator &lt;&lt;(ostream&amp;, const Proc&amp;); inline istream&amp; operator &gt;&gt;(istream&amp;, Proc&amp;); в...

Перегрузка файлового ввода-вывода - C++
Здравствуйте! У меня вопрос такой вот: для файлового ввода-вывода сколько надо функций перегружать? столько хватит friend...

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Эксперт CЭксперт С++
13226 / 7498 / 845
Регистрация: 27.09.2012
Сообщений: 18,416
Записей в блоге: 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>&);
1
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'
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
09.11.2013, 00:40 #4
qwestcl, http://ideone.com/8KttXe
1
Croessmah
Эксперт CЭксперт С++
13226 / 7498 / 845
Регистрация: 27.09.2012
Сообщений: 18,416
Записей в блоге: 3
Завершенные тесты: 1
09.11.2013, 00:46 #5
Цитата Сообщение от qwestcl Посмотреть сообщение
Errors:
Имя параметра шаблона поменяйте у friend функций тогда.
1
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 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];
1
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 его подчеркивает как ошибку, но все нормально компилирует, странно. не могли бы вы поснить?
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
09.11.2013, 01:06 #8
Цитата Сообщение от qwestcl Посмотреть сообщение
что это(<>) такое?
Явное указание, что это специализация шаблона функции.

Добавлено через 2 минуты
Т.е. тут объявляется другом не шаблон ф-ии (как у Croessmah), а только его специализация для типа T.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2013, 01:06
Привет! Вот еще темы с ответами:

Перегрузка потокового ввода/вывода - C++
Вот сама перегрузка ostream&amp; operator&lt;&lt; (ostream&amp; out, Poli&amp; outstream) { out&lt;&lt;&quot;Степень полинома=&quot;&lt;&lt;outstream.n&lt;&lt;endl; for(int...

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.11.2013, 01:06
Ответ Создать тему
Опции темы

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