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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.82
Sambady
0 / 0 / 0
Регистрация: 01.12.2011
Сообщений: 6
#1

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

14.12.2011, 12:14. Просмотров 4386. Ответов 12
Метки нет (Все метки)

Добрый день

не могу понять как реализовать перегрузку << для шаблонного класса

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
template <class T>
class List
{
    public:
        List();
        virtual ~List();
       
        friend ostream& operator<<(ostream& os,List<T>& obj);
 
        T elem;
};
 
template <class T> ostream& operator<<(ostream& os,List<T>& obj)
{
    os << obj.elem;
    return os;
}
 
 
int main()
{
    List<int> a;
    a.elem=5;
    cout << a;
}
если перегрузку оператора не делать дружественной функцией то всё работает
но мне нужен именно friend
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.12.2011, 12:14     Перегрузка operator<< для шаблонного класса
Посмотрите здесь:

Перегрузка оператора вывода на консоль для шаблонного класса C++
Перегрузка << , >> для шаблонного класса C++
C++ Перегрузка оператора шаблонного класса в зависимости от типа
Не работает operator<< шаблонного класса Vector C++
Перегрузка "operator =" для шаблона класса C++
Перегрузка операторов шаблонного класса дружественными функциями C++
C++ Перегрузка оператора << шаблонного класса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
14.12.2011, 12:27     Перегрузка operator<< для шаблонного класса #2
Sambady,

C++
1
2
3
4
5
6
7
8
9
template<class T2>
friend std::ostream& operator <<(ostream& os, const List<T2>& obj);
 
template<class T>
std::ostream& operator <<(ostream& os, const List<T>& obj)
{
    os << obj.elem;
    return os;
}
Bers
Заблокирован
14.12.2011, 12:32     Перегрузка operator<< для шаблонного класса #3
А вот так вы не хотите сделать:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template <class T>
class List
{
public:
    //List();
    //virtual ~List();
 
 
    //не забудим явно указать классу, что его френд - шаблон функции
    //посредством указания явного параметра шаблона функции
    friend ostream& operator<< <T>(ostream& os,List<T>& obj);
 
    T elem;
};
 
template <class T>
ostream& operator<< (ostream& os,List<T>& obj)
{
    os << obj.elem;
    return os;
}
Sambady
0 / 0 / 0
Регистрация: 01.12.2011
Сообщений: 6
14.12.2011, 12:34  [ТС]     Перегрузка operator<< для шаблонного класса #4
ForEveR, спасибо помогло
а почему эта функция не может обращаться к private членам класса?

Добавлено через 1 минуту
Bers, так почемуто компилятор ругается на undefined reference
компилятор gcc
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
14.12.2011, 12:48     Перегрузка operator<< для шаблонного класса #5
Sambady, Должна мочь. Код и ошибку в студию
Bers
Заблокирован
14.12.2011, 12:49     Перегрузка operator<< для шаблонного класса #6
Цитата Сообщение от Sambady Посмотреть сообщение
Bers, так почемуто компилятор ругается на undefined reference
компилятор gcc
Хз, почему он ругается. Я вообще не вижу проблем, согласно правилам построения/использования шаблонов функций. К тому же, вижал студия такой код кушает на ура.

А вот компилятор сайта: http://liveworkspace.org/code/1c00c0...344096cd3e2f2d
Ругается. Зато, наглядно демонстрирует, что френд без проблем имеет доступ к приватным данным шаблона класса
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
14.12.2011, 12:52     Перегрузка operator<< для шаблонного класса #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
#include <iostream>
 
template<class T>
class Value
{
public:
   Value(const T& val):val_(val)
   {
   }
   template<class T2>
   friend std::ostream& operator << (std::ostream& os, const Value<T2>& val);
private:
   T val_;
};
 
template<class T>
std::ostream& operator << (std::ostream& os, const Value<T>& val)
{
   os << val.val_;
   return os;
}
 
int main()
{
   Value<int> v(5);
   std::cout << v << std::endl;
   Value<std::string> c("a");
   std::cout << c << std::endl;
}
Bers
Заблокирован
14.12.2011, 12:57     Перегрузка operator<< для шаблонного класса #8
Цитата Сообщение от Sambady Посмотреть сообщение
Bers, так почемуто компилятор ругается на undefined reference
компилятор gcc
Все! Понял почему)))

Видимо вижал студия просто более раздолбайно относится к стандарту в этом моменте.

Фишка вот в чем:
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
template <class T>
class List
{
public:
    //List();
    //virtual ~List();
 
 
    //компилятор gcc ругается на то, что он не знает ни о каких
    // таких шаблонах. Он думает, что тут объявляется 
    //фредозный прототип с указанием формального параметра шаблона
    //при том, что он не понимает, что прототип - шаблонный
    //На что и ругается.
    friend ostream& operator<< <T>(ostream& os,List<T>& obj);
 
    T elem;
};
 
template <class T>
ostream& operator<< (ostream& os,List<T>& obj)
{
    os << obj.elem;
    return os;
}

Лечется вот так: http://liveworkspace.org/code/b45316...21e9b84b239b20
Sambady
0 / 0 / 0
Регистрация: 01.12.2011
Сообщений: 6
14.12.2011, 13:24  [ТС]     Перегрузка operator<< для шаблонного класса #9
ForEveR, большое спасибо. косяк действительно мой. забыл конст поставить. всё работает

Добавлено через 3 минуты
Bers, всё равно не работает
ругается
error: template-id 'operator<< <int>' for 'std::ostream& operator<<(std::ostream&, List<int>&)' does not match any template declaration
Bers
Заблокирован
14.12.2011, 13:27     Перегрузка operator<< для шаблонного класса #10
Sambady, я конечно могу ошибаццо, но по указанной выше ссылки компилятор-онлайн gcc
И там он прекрасно работает. Поэтому, если у вас чего то не работает, можно сделать предположение - что вы что-то не так делаете.
Sambady
0 / 0 / 0
Регистрация: 01.12.2011
Сообщений: 6
14.12.2011, 13:53  [ТС]     Перегрузка operator<< для шаблонного класса #11
Bers, скорей всего проблема у меня в компиляторе
компилятор на sparcовом серваке

Добавлено через 7 минут
Bers,
проблема в компиляторе
компилировал на sparc сервере не работало в винде заработало
спасибо
kovalexius
1 / 1 / 0
Регистрация: 10.10.2014
Сообщений: 7
28.03.2015, 18:23     Перегрузка operator<< для шаблонного класса #12
лечится так, т.е. специализацией шаблона?
Я тоже думаю на этот счет.
Ведь нам надо всего лишь навсего написать перегруженную глобальную функцию-оператор << с двумя параметрами, первый параметр - ostream& os
а второй параметр - ссылка на нашего типа.
А если наш тип шаблонный?
Вставить полностью T в качестве второго параметра нельзя, потому что эта реализация создаст двойственность в стандартной библиотеке, ведь там в недрах определены перегруженные operator<< для STL'ных типов, а наша реализация тогда все переопределит как бы. Т.е. создаст двойственность
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.03.2015, 18:42     Перегрузка operator<< для шаблонного класса
Еще ссылки по теме:

Перегрузка operator* у класса Complex C++
C++ Перегрузка operator< для двух экземпляров класса отрезок
Перегрузка operator>> для производного класса C++
C++ Перегрузить operator<<() для шаблонного класса (перегрузка оператора вывода)
Как корректно передать в метод шаблонного класса объект шаблонного класса в качестве параметра? C++

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

Или воспользуйтесь поиском по форуму:
hoggy
6168 / 2534 / 444
Регистрация: 15.11.2014
Сообщений: 5,608
Завершенные тесты: 1
28.03.2015, 18:42     Перегрузка operator<< для шаблонного класса #13
Цитата Сообщение от kovalexius Посмотреть сообщение
Ведь нам надо всего лишь навсего написать перегруженную глобальную функцию-оператор << с двумя параметрами

Не по теме:

думаю, за прошедших 4 года все, кому было нужно, уже во всем разобрались...

Yandex
Объявления
28.03.2015, 18:42     Перегрузка operator<< для шаблонного класса
Ответ Создать тему
Опции темы

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