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

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

Восстановить пароль Регистрация
 
Gwini
10 / 10 / 3
Регистрация: 08.03.2014
Сообщений: 70
09.08.2014, 20:28     Перегруженный operator<< #1
Есть допустим такая дружественная функция:

объявление
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<<
Посмотрите здесь:

C++ перегруженный синус
C++ перегруженный оператор <<
operator char() или operator int() C++
C++ перегруженный оператор вывода
C++ Перегруженный оператор
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
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
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
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
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
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++ перегруженный конструктор
Перегруженный operator= C++
Реализация operator + через operator += C++

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

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

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

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