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

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

Войти
Регистрация
Восстановить пароль
 
Gwini
10 / 10 / 3
Регистрация: 08.03.2014
Сообщений: 70
#1

Перегруженный operator<< - C++

09.08.2014, 20:28. Просмотров 261. Ответов 7
Метки нет (Все метки)

Есть допустим такая дружественная функция:

объявление
C++
1
template<typename Type> friend std::ostream& operator<<(std::ostream&, Stack<Type>&);
определение
C++
1
2
3
4
5
6
7
8
9
10
11
12
template<typename Type>
std::ostream& operator<<(std::ostream& stream, Stack<Type>& obj_show)           
{
    Stack<Type>::node* ptr = obj_show.top;
    while (ptr)
    {
        stream << ptr->cell;
        ptr = ptr->priv;
    }
 
    return stream;
}
не вдаваясь в подробности — шаблон класса:
C++
1
2
3
4
5
template<typename Type>
class Stack
{
private:
.....
У меня вопрос: как работает даная дружественная функция? Она, как я понимаю, сама по себе независимая шаблонная функция и выходит, что принмая аргумент, допустим Stack<int> она определяется как Stack<Stack<int> > или это не так? Все в принципе работает, но я не понимаю механизма. Если в шаблоне заменить Stack<Type> на просто Type появляется ошибка: неоднозначная операция " << ". Почему в первом случае нет этой неоднозначности? Спаисбо.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.08.2014, 20:28     Перегруженный operator<<
Посмотрите здесь:

Перегруженный operator= - C++
Изучаю перегрузку, возник вопрос. Есть класс: class chk { private: int id; int data; public: chk(); chk(int _data);

Operator +, operator += — какой через какой реализовывать? - C++
Для class Fraction { // ... public: Fraction operator + ( const Fraction&amp; right ) const; Fraction&amp; operator += ( const...

перегруженный синус - C++
#include &lt;iostream&gt; #include &lt;cmath&gt; #define PI 3.14159265; using namespace std; int main(){ double a,b,x,y,e; e=2.71; ...

перегруженный конструктор - C++
можно пример перегруженного конструктора ?)

Перегруженный оператор - C++
MathClass = Harry; Раньше я думал, что перегрузка - это предоставление оператору функций, которых, он изначально не имел. Что...

перегруженный оператор << - C++
подскажите как перегрузить оператор &lt;&lt; для класса как описать само перегружение friend ostream&amp; operator &lt;&lt; (ostream &amp;c, const...

Не работает перегруженный оператор - C++
Привет, у меня есть класс такой: class Sterling { private: long pounds = 0; int shillings = 0; int pennys = 0; public:...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,012
09.08.2014, 20:38     Перегруженный operator<< #2
Цитата Сообщение от Gwini Посмотреть сообщение
template<typename Type> friend std::ostream& operator<<(std::ostream&, Stack<Type>&);
-> для Stack<int>
std::ostream& operator<<(std::ostream&, Stack<int>&);
Gwini
10 / 10 / 3
Регистрация: 08.03.2014
Сообщений: 70
09.08.2014, 20:42  [ТС]     Перегруженный operator<< #3
Цитата Сообщение от 0x10 Посмотреть сообщение
std::ostream& operator<<(std::ostream&, Stack<int>&);
ну так я пробовал, но это тогда не шаблонная функция и нужно переопредять ее для каждого необходимого опредления класса

Добавлено через 56 секунд
или ты не о том?
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,012
09.08.2014, 20:42     Перегруженный operator<< #4
Я показал пример как происходит подстановка типа, а не как нужно писать.
Gwini
10 / 10 / 3
Регистрация: 08.03.2014
Сообщений: 70
09.08.2014, 20:46  [ТС]     Перегруженный operator<< #5
Цитата Сообщение от 0x10 Посмотреть сообщение
Я показал пример как происходит подстановка типа, а не как нужно писать.
ясно, ну я так и подумал, но не могу понять почему. Ведь вместо Type подставляется тип Stack<int> (например) и в функцие выходит Stack< Stack<int> > но на самом деле иначе, почему?
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,012
09.08.2014, 20:53     Перегруженный operator<< #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Функция принимает стек элементов типа Т. Ты передаешь стек интов. Почему инстанцированный шаблон вдруг должен начать принимать стек стеков интов?
Gwini
10 / 10 / 3
Регистрация: 08.03.2014
Сообщений: 70
09.08.2014, 21:04  [ТС]     Перегруженный operator<< #7
Цитата Сообщение от 0x10 Посмотреть сообщение
Функция принимает стек элементов типа Т. Ты передаешь стек интов. Почему инстанцированный шаблон вдруг должен начать принимать стек стеков интов?
Понятно. То есть неоднозначности нет потому что во втором аргументе должен обезательно пристутсвовать тип Stack<> и в случае обнаружения Stack<> компилятор находит необходимую вресию и подставляет вместо Stack<Type> тот, который указаный в аргументе. Я все правильно понял?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2014, 21:08     Перегруженный operator<<
Еще ссылки по теме:

Функции и перегруженный оператор - C++
Помогите реализовать на С++: 1.Определить пользовательский тип данных fraction (дробь), представляющий собой структуру из 2х полей:...

Перегруженный оператор вывода - C++
Есть базовый класс Точка и его наследник Круг. Как в Круге использовать operator&lt;&lt; для Точки? Надо вывести координаты центра круга ...

Глобальный перегруженный оператор - C++
Как организовать работу глобального перегруженного оператора &quot;-&quot;, который должен сравнивать 5 массивов(экземпляры класса). Помогите,...

Не вызывается перегруженный оператор - C++
#include&lt;iostream&gt; using namespace std; struct dates { int num; int count; dates *back; dates *forward; }; class...

Перегруженный оператор ввода - C++
Всем привет, как правильно создать перегруженный оператор ввода для инициализации данных об обьекте к примеру class Planet{ ...


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

Или воспользуйтесь поиском по форуму:
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,012
09.08.2014, 21:08     Перегруженный operator<< #8
Шаблон функции принимает вторым аргументом объект шаблонного класса стек и этот шаблон функции параметризован типом объектов в стеке.

Ну да, все логично.
Тупая ведь подстановка.
Сейчас специально открыл книжку Вандервуда - он на этом моменте даже не останавливается, просто сразу дает пример с комментарием: "запишется вот так".
Yandex
Объявления
09.08.2014, 21:08     Перегруженный operator<<
Ответ Создать тему
Опции темы

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