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

Перегрузка << , >> для шаблонного класса - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Serejke_qq
 Аватар для Serejke_qq
149 / 107 / 9
Регистрация: 06.07.2011
Сообщений: 224
Завершенные тесты: 2
20.01.2012, 22:51     Перегрузка << , >> для шаблонного класса #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
#include <iostream>
 
using namespace std;
 
template <class T>
class test
{
    private:
        T x;
 
    public :
        test(T set);
 
        friend ostream& operator << (ostream& , test& );
        friend istream& operator >> (istream& , test& );
};
 
template <class T>
istream& operator >> (istream& in, test<T>& obj)
{
    in >> obj.x;
    return in;
}
 
template <class T>
ostream& operator << (ostream& out,  test<T>& obj)
{
    out << obj.x;
    return out;
}
 
template <class T>
test<T>::test(T set)
{
    x = set;
}
 
//-----------------------------------------------
int main()
{
    test<int> t(0);
 
    cin >> t;
    cout << t;
 
    return 0;
}
Что не так и почему..?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
20.01.2012, 23:13     Перегрузка << , >> для шаблонного класса #2
друзья декларятся как шаблоны

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>
 
using namespace std;
 
template <class T>
class test
{
    private:
        T x;
 
    public :
        test(T set);
 
        template <class T> 
        friend ostream& operator << (ostream& , const test<T>& );
 
        template <class T> 
        friend istream& operator >> (istream& , test<T>& );
};
 
template <class T>
istream& operator >> (istream& in, test<T>& obj)
{
    in >> obj.x;
    return in;
}
 
template <class T>
ostream& operator << (ostream& out,  const test<T>& obj)
{
    out << obj.x;
    return out;
}
 
template <class T>
test<T>::test(T set)
{
    x = set;
}
 
//-----------------------------------------------
int main()
{
    test<int> t(0);
 
    cin >> t;
    cout << t;
 
    return 0;
}
Dekio
Фрилансер
Эксперт C++
 Аватар для Dekio
5816 / 1214 / 214
Регистрация: 23.11.2010
Сообщений: 3,378
Записей в блоге: 1
20.01.2012, 23:18     Перегрузка << , >> для шаблонного класса #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
#include <iostream>
 
using namespace std;
 
template <class T>
class test
{
    public :
        T x;
        test(T set);
 
        template <typename Type>
        friend ostream& operator << (ostream& ,  test<Type>& );
        
        template <typename Type>
        friend istream& operator >> (istream& ,  test<Type>& );
};
 
 
template <class T>
istream& operator >> (istream& in, test<T>& obj)
{
    in >> obj.x;
    return in;
}
 
template <class T>
ostream& operator << (ostream& out,  test<T>& obj)
{
    out << obj.x;
    return out;
}
 
template <class T>
test<T>::test(T set)
{
    x = set;
}
 
//-----------------------------------------------
int main()
{
    test<int> t(0);
 
    cin >> t;
    cout << t;
 
    return 0;
}

DU, так нельзя.

Цитата Сообщение от DU Посмотреть сообщение
template <class T> class test
и там же


Цитата Сообщение от DU Посмотреть сообщение
template <class T> friend ostream& operator << (ostream& , const test<T>& );
Ma3a
Эксперт C++
612 / 456 / 31
Регистрация: 28.01.2011
Сообщений: 605
20.01.2012, 23:28     Перегрузка << , >> для шаблонного класса #4
Serejke_qq, можно также объявить заранее шаблон test<T>, потом написать объявление шаблонной функции operator << (operator >>), а далее воспользоваться при описании внутренностей test<T> специализацией operator << (operator >>) для конкретного типа T:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template <typename T>
class test;
template <typename T>
ostream & operator << (ostream & out, test<T> & obj);
 
template <class T>
class test
{
    private:
        T x;
 
    public :
        test(T set);
 
        friend ostream& operator << <T> (ostream& , test<T>& );
};
// ...
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
20.01.2012, 23:34     Перегрузка << , >> для шаблонного класса #5
Dekio , я не понял что нельзя и почему нельзя?

совпадение записи <class T> для класса и для функций? если вы это имели в виду, то возможно и нельзя. что в стандарте написано я не знаю. Но лучше конечно так не делать и для ф-ий что-то другое написать. Но студия скомпиляла, я и запостил.
Быть может в декларации открываеттся своего рода скоуп, внутри которого имена перекрывают имена из вышестоящего скоупа.
Что-то аналогичное
C++
1
2
3
4
int i = 0;
{
  int i = 0;
}
Но чтобы не было путаницы лучше так не делать. С этим я согласен.
Dekio
Фрилансер
Эксперт C++
 Аватар для Dekio
5816 / 1214 / 214
Регистрация: 23.11.2010
Сообщений: 3,378
Записей в блоге: 1
20.01.2012, 23:46     Перегрузка << , >> для шаблонного класса #6
Цитата Сообщение от DU Посмотреть сообщение
совпадение записи <class T> для класса и для функций? если вы это имели в виду, то возможно и нельзя.
Именно
Yandex
Объявления
20.01.2012, 23:46     Перегрузка << , >> для шаблонного класса
Ответ Создать тему
Опции темы

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