С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

09.08.2014, 20:28. Просмотров 272. Ответов 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 появляется ошибка: неоднозначная операция " << ". Почему в первом случае нет этой неоднозначности? Спаисбо.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.08.2014, 20:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегруженный operator<< (C++):

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

Class & operator's |Error: undefined reference to operator - C++
Компилирует нормально, но когда хочу использовать оператор выдает ошибку:undefined reference to 'operator..(Fraction const&amp;, Fraction...

Вызов operator[] через operator[] const - C++
Перелистывал Майерса, наткнулся на код, подскажите пожалуйста почему он советует закомментированный вариант кода, не проще сделать как...

operator char() или operator int() - C++
Здорова госпдо! Снова ничо не ясно как всегда. Разбираю программку из книги Страуструпа, там он описывает класс String в нем есть ...

Реализация operator + через operator += - C++
внутри следующей темы возник вопрос, ответ на который так и не был получен: ...

Перегрузить операторы operator+() и operator*() в пользовательском классе "Комплексное число" - C++
Здравствуйте. Предлагаю заняться арифметикой. Создал прослейший класс, перегрузил операторы сложения и умножения, в конструкторе...

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

Добавлено через 56 секунд
или ты не о том?
0
0x10
2484 / 1659 / 249
Регистрация: 24.11.2012
Сообщений: 4,136
09.08.2014, 20:42 #4
Я показал пример как происходит подстановка типа, а не как нужно писать.
0
Gwini
10 / 10 / 3
Регистрация: 08.03.2014
Сообщений: 70
09.08.2014, 20:46  [ТС] #5
Цитата Сообщение от 0x10 Посмотреть сообщение
Я показал пример как происходит подстановка типа, а не как нужно писать.
ясно, ну я так и подумал, но не могу понять почему. Ведь вместо Type подставляется тип Stack<int> (например) и в функцие выходит Stack< Stack<int> > но на самом деле иначе, почему?
0
0x10
2484 / 1659 / 249
Регистрация: 24.11.2012
Сообщений: 4,136
09.08.2014, 20:53 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Функция принимает стек элементов типа Т. Ты передаешь стек интов. Почему инстанцированный шаблон вдруг должен начать принимать стек стеков интов?
1
Gwini
10 / 10 / 3
Регистрация: 08.03.2014
Сообщений: 70
09.08.2014, 21:04  [ТС] #7
Цитата Сообщение от 0x10 Посмотреть сообщение
Функция принимает стек элементов типа Т. Ты передаешь стек интов. Почему инстанцированный шаблон вдруг должен начать принимать стек стеков интов?
Понятно. То есть неоднозначности нет потому что во втором аргументе должен обезательно пристутсвовать тип Stack<> и в случае обнаружения Stack<> компилятор находит необходимую вресию и подставляет вместо Stack<Type> тот, который указаный в аргументе. Я все правильно понял?
0
0x10
2484 / 1659 / 249
Регистрация: 24.11.2012
Сообщений: 4,136
09.08.2014, 21:08 #8
Шаблон функции принимает вторым аргументом объект шаблонного класса стек и этот шаблон функции параметризован типом объектов в стеке.

Ну да, все логично.
Тупая ведь подстановка.
Сейчас специально открыл книжку Вандервуда - он на этом моменте даже не останавливается, просто сразу дает пример с комментарием: "запишется вот так".
1
09.08.2014, 21:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2014, 21:08
Привет! Вот еще темы с ответами:

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

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

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

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