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

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

Войти
Регистрация
Восстановить пароль
 
Skrip
0 / 0 / 0
Регистрация: 23.07.2014
Сообщений: 7
#1

Шаблон перегруженого оператора ввода вывода - C++

24.07.2014, 13:20. Просмотров 390. Ответов 8
Метки нет (Все метки)

Здравствуйте уважаемые форумчане

Собственно такая проблема:

Есть шаблон класса.
Для него надо перегрузить функцию ввода-вывода.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
template <class X>
class Larray                            
    {
                        ......................
        public:
            ......................
            friend ostream &operator << (ostream &stream, Larray<X> &a);
    };
 
template <class X> ostream &operator<< (ostream &stream, Larray<X> &a)      
    {
            .....................
        return stream;
    }
 
int main()
    {
        Larray<int> c1();
        cout << c1;                   //// на эту строчку ругается компилятор.
 
        return 0;
    }
что я делаю не так?

Сам только учусь, многово не знаю, помогите пожалуйста
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.07.2014, 13:20     Шаблон перегруженого оператора ввода вывода
Посмотрите здесь:

Перегрузка оператора ввода вывода - C++
Есть два хэдера(header.h и Array.h) и исполняемая программа main.cpp в которой я как раз и обращаюсь к оператору ввода Array.h ...

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

В чем ошибка? Перегрузка оператора ввода\вывода - C++
Доброго времени суток. Где я допустил ошибку? Перегрузка оператора как-будто игнорируется. Выводит просто &quot;test&quot;, а я ожидаю &quot;: test&quot;. ...

шаблон оператора - C++
когда пишу шаблон класса то при перегрузке оператора выдает ошибку, посмотрите что не так. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; ...

Перегрузка оператора вывода - C++
Доброго времени суток. Задача программы: умножение и деление комплексных чисел. Файл number.h #pragma once class number { ...

Перегрузка оператора вывода - C++
Я сотворил одну программку, при выводе первый элемент массива не правильный. Уже перегрузил оператор вывода, но не понимаю что не так....

Перегрузка оператора вывода - C++
Доброго времени суток. Столкнулся с проблемой: функция перегрузки вывода возвращает некорректное значение. Код вызова перегрузки ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
24.07.2014, 13:21     Шаблон перегруженого оператора ввода вывода #2
Skrip, Уберите скобки при создании объекта. Иначе это функция c1 которая не принимает ничего и возвращает объект типа Larray<int>.
Ну и еще одно. Если friend то лучше оставить его template-ным, т.е. сделать что-то вроде

C++
1
2
template<typename X2>
friend ostream &operator << (ostream &stream, Larray<X2> &a);
Skrip
0 / 0 / 0
Регистрация: 23.07.2014
Сообщений: 7
24.07.2014, 13:26  [ТС]     Шаблон перегруженого оператора ввода вывода #3
там в скобках аргументы для конструктора, не стал писать просто.

собственно сам класс и код рабочие (изначально он не был шаблоном) проблемы начались именно когда я попытался сделать из него шаблон.
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
24.07.2014, 13:28     Шаблон перегруженого оператора ввода вывода #4
Skrip, Тогда читайте выше. Поправьте объявление оператора вывода в поток, чтобы данная friend функция была шаблонной.
Ilot
Модератор
Эксперт С++
1789 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
24.07.2014, 13:31     Шаблон перегруженого оператора ввода вывода #5
Цитата Сообщение от Skrip Посмотреть сообщение
собственно сам класс и код рабочие (изначально он не был шаблоном) проблемы начались именно когда я попытался сделать из него шаблон.
Ну так не у вас одного подобная ошибка встречается. Нужно делать шаблон дружественной функции с иным параметром шаблона. Т.е. так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template <class X>
class Larray                            
{
    ......................
    public:
    ......................
    template <class Y>
    friend ostream &operator << (ostream &stream, Larray<Y> &a);
};
 
template <class X> ostream &operator<< (ostream &stream, Larray<X> &a)      
{
    .....................
    return stream;
}
Skrip
0 / 0 / 0
Регистрация: 23.07.2014
Сообщений: 7
24.07.2014, 13:46  [ТС]     Шаблон перегруженого оператора ввода вывода #6
Спасибо помогло.
будет большой наглостью попросить объяснить почему так?
просто хочу понять.
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
24.07.2014, 13:53     Шаблон перегруженого оператора ввода вывода #7
Skrip, По стандарту, если в шаблонном классе, объявлена дружественная нешаблонная функция - она является нешаблонной (тут есть отличие от функции-члена, которая является сама по себе шаблонной, т.к. находится в шаблонном классе).

Вот что написано в доке gcc по параметру варнингу -Wnon-template-friend
Since the advent of explicit template specification support in G++, if the name of the friend is an unqualified-id (i.e., `friend foo(int)'), the C++ language specification demands that the friend declare or define an ordinary, nontemplate function. (Section 14.5.3)
Ilot
Модератор
Эксперт С++
1789 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
24.07.2014, 13:57     Шаблон перегруженого оператора ввода вывода #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <class X>
class Larray                            
    {
                        ......................
        public:
            ......................
            friend ostream &operator << (ostream &stream, Larray<X> &a);//объявление не шаблонной функции
    };
 
template <class X> ostream &operator<< (ostream &stream, Larray<X> &a) //объявление и определение шаблонной функции     
    {
            .....................
        return stream;
    }
Тут компилятор ругается на отсутствие определения дружественной функции. Но если сделать такую казяку базяку все будет работать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template <class X>
class Larray
{
    public:
    //template <class Y>
    friend ostream &operator << (ostream &stream, Larray<X> &a)
    {
        return stream;
    }
};
 
template <class X> ostream &operator<< (ostream &stream, Larray<X> &a)
{
    return stream;
}
int main() {
    Larray<int> c;
    cout << c;
    return 0;
}
Потому как теперь вы определили дружественную функцию.
Это к тому, что у вас объявляются две разные функции: одна не шаблонная вторая шаблонная. Объявление класса шаблонным не делает таковой дружественную функцию.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.07.2014, 13:57     Шаблон перегруженого оператора ввода вывода
Еще ссылки по теме:

Перегрузка оператора вывода - C++
Здравствуйте! Подскажите пожалуйста как можно решить проблему с перегрузкой оператора. В моем коде выдает ошибку: error C2440: '=' :...

Наследование оператора вывода - C++
////////////////////////////////////////////////////////////////////////// struct SomeStruct { }; ...

Перегрузка оператора вывода - C++
Ребят, привет! Проблемная часть - operator &lt;&lt; если комментировать его вызов в main - сборка осуществляется, иначе - нет. ...

Перегрузка оператора вывода - C++
Пытаюсь написать программку, но возникла ошибка с выводом информации на экран. Вот мой код: int MAX_ARRAY_SIZE = 2147483647; ...

Перегрузка оператора вывода - C++
Здравствуйте. Я пишу учебную программу реализующая арифметику обыкновенных дробей. И в данный момент перезагружаю оператор вывода. ...


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

Или воспользуйтесь поиском по форуму:
Skrip
0 / 0 / 0
Регистрация: 23.07.2014
Сообщений: 7
24.07.2014, 13:57  [ТС]     Шаблон перегруженого оператора ввода вывода #9
Эвоно как....
Вроде осознал, большое спасибо всем
Yandex
Объявления
24.07.2014, 13:57     Шаблон перегруженого оператора ввода вывода
Ответ Создать тему
Опции темы

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