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

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

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

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

14.12.2011, 12:14. Просмотров 4519. Ответов 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++):

Перегрузить operator<<() для шаблонного класса (перегрузка оператора вывода) - C++
Здравствуйте. Перегружаю оператор вывода для шаблонного класса. using namespace std; template &lt;class Element&gt; class List { ...

Перегрузка << , >> для шаблонного класса - C++
Доброго времени суток всем! Данная тема не раз подымалась на форуме.. Но есть но.. Помогите перегрузить операторы побитового сдвига для...

Перегрузка оператора -> для шаблонного класса - C++
Здравствуйте! Возникла проблема: не могу додуматься как перегрузить оператор -&gt; так, чтобы он корректно работал. Вот код: template&lt;class...

Перегрузка оператора вывода на консоль для шаблонного класса - C++
Следующий код компилируется, но не линкуется: #include &lt;iostream&gt; using namespace std; template &lt;typename T&gt; class A { ...

Перегрузка operator>> для производного класса - C++
Базовый класс: Taxi_Car.h: #pragma once #include&lt;string&gt; using namespace std; class Taxi_Car { string Marka;

Не работает operator<< шаблонного класса Vector - C++
Компилятор выдает ошибку error LNK2019: unresolved external symbol &quot;class std::basic_ostream&lt;char,struct std::char_traits&lt;char&gt; &gt; &amp; __cdecl...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
14.12.2011, 12:27 #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 #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  [ТС] #4
ForEveR, спасибо помогло
а почему эта функция не может обращаться к private членам класса?

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

А вот компилятор сайта: http://liveworkspace.org/code/1c00c0...344096cd3e2f2d
Ругается. Зато, наглядно демонстрирует, что френд без проблем имеет доступ к приватным данным шаблона класса
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
14.12.2011, 12:52 #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 #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  [ТС] #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 #10
Sambady, я конечно могу ошибаццо, но по указанной выше ссылки компилятор-онлайн gcc
И там он прекрасно работает. Поэтому, если у вас чего то не работает, можно сделать предположение - что вы что-то не так делаете.
Sambady
0 / 0 / 0
Регистрация: 01.12.2011
Сообщений: 6
14.12.2011, 13:53  [ТС] #11
Bers, скорей всего проблема у меня в компиляторе
компилятор на sparcовом серваке

Добавлено через 7 минут
Bers,
проблема в компиляторе
компилировал на sparc сервере не работало в винде заработало
спасибо
kovalexius
1 / 1 / 0
Регистрация: 10.10.2014
Сообщений: 7
28.03.2015, 18:23 #12
лечится так, т.е. специализацией шаблона?
Я тоже думаю на этот счет.
Ведь нам надо всего лишь навсего написать перегруженную глобальную функцию-оператор << с двумя параметрами, первый параметр - ostream& os
а второй параметр - ссылка на нашего типа.
А если наш тип шаблонный?
Вставить полностью T в качестве второго параметра нельзя, потому что эта реализация создаст двойственность в стандартной библиотеке, ведь там в недрах определены перегруженные operator<< для STL'ных типов, а наша реализация тогда все переопределит как бы. Т.е. создаст двойственность
hoggy
6535 / 2715 / 469
Регистрация: 15.11.2014
Сообщений: 5,993
Завершенные тесты: 1
28.03.2015, 18:42 #13
Цитата Сообщение от kovalexius Посмотреть сообщение
Ведь нам надо всего лишь навсего написать перегруженную глобальную функцию-оператор << с двумя параметрами

Не по теме:

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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.03.2015, 18:42
Привет! Вот еще темы с ответами:

Перегрузка operator< для двух экземпляров класса отрезок - C++
Всем добра, в классе отрезок хочу перегрузить операцию &lt; правильно ли я сделал ? При этом отрезок с координатами x1=1 y1=1 и x2=4 y2=4...

Перегрузка оператора << шаблонного класса - C++
Всем доброго времени суток! Целый день бьюсь над перегрузкой оператора &lt;&lt; в шаблонном классе одномерный массив. Пока получилось родить...

Не работает перегрузка операторов шаблонного класса - C++
помогите кто может разобрать что не работает( в понедельник екзамен, а я так туплю... все ошибки и код прилагаются Error 1 error...

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


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

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

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