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

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

Восстановить пароль Регистрация
 
Skrip
0 / 0 / 0
Регистрация: 23.07.2014
Сообщений: 7
24.07.2014, 13:20     Шаблон перегруженого оператора ввода вывода #1
Здравствуйте уважаемые форумчане

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

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

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;
    }
что я делаю не так?

Сам только учусь, многово не знаю, помогите пожалуйста
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
24.07.2014, 13:28     Шаблон перегруженого оператора ввода вывода #4
Skrip, Тогда читайте выше. Поправьте объявление оператора вывода в поток, чтобы данная friend функция была шаблонной.
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 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++ Перегрузка оператора ввода ,вывода
Перегрузка оператора вывода C++

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

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

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