Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 24.12.2015
Сообщений: 14
1

Перегрузка для шаблонного класса

12.11.2018, 12:10. Показов 1337. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть шаблонный класс, который определен в заголовочном файле(list.h)
Определение перегрузки вывода во втором файле(list.cpp)
Компилятор ошибок не выдает, но линковщик выдал ошибку LNK1120 и LNK2019.
Сайт майкрософта в итоге привел меня к фразе: "Определение шаблона члена находится за пределами класса. Visual C++ имеет ограничение, в котором шаблоны членов должны быть полностью определены в включающего класса."
Значит ли это, что мне нужно определять перегрузку оператора в заголовочном файле?

Вот код:

Файл list.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#pragma once
#include <iostream>
 
using namespace std;
 
template <class T> class List;
 
template <class T>
class Node
{
    friend class List<T>;
        ....
};
 
template <class T> class List
{
    friend ostream& operator << (ostream &os, const List<T>&myList);
       ....
}
Файл list.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
#include "stdafx.h"
#include "list.h"
 
 
template<class T> class List;
 
template <typename T>
ostream& operator<< (ostream & os, const List<T>& myList)
{
    ...
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.11.2018, 12:10
Ответы с готовыми решениями:

Перегрузка << , >> для шаблонного класса
Доброго времени суток всем! Данная тема не раз подымалась на форуме.. Но есть но.. Помогите...

Перегрузка [][] для шаблонного класса
КАК перегрузка для шаблонного класса template&lt;class ITEM&gt;...

Перегрузка оператора -> для шаблонного класса
Здравствуйте! Возникла проблема: не могу додуматься как перегрузить оператор -&gt; так, чтобы он...

Перегрузка operator<< для шаблонного класса
Добрый день не могу понять как реализовать перегрузку &lt;&lt; для шаблонного класса template...

9
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
12.11.2018, 12:17 2
Нельзя компилировать отдельно файл list.cpp, т.к. компилятор не будет инстанцировать этот шаблон.
Переносите всё в list.h
0
0 / 0 / 0
Регистрация: 24.12.2015
Сообщений: 14
12.11.2018, 12:22  [ТС] 3
Цитата Сообщение от zss Посмотреть сообщение
Переносите всё в list.h
Только что перенес все в заголовочный файл, но ошибка осталась
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
12.11.2018, 12:32 4
Цитата Сообщение от Bash_B00M Посмотреть сообщение
перенес все в заголовочный файл
#include "stdafx.h" был выкинут? list.cpp удалил?
Должно было получиться примерно

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#pragma once
#include <iostream>
 
using namespace std;
 
template <class T> class List;
 
template <class T>
class Node
{
    friend class List<T>;
        ....
};
 
template <class T> class List
{
    friend ostream& operator << (ostream &os, const List<T>&myList);
       ....
}
 
template <typename T>
ostream& operator<< (ostream & os, const List<T>& myList)
{
    ...
}
0
0 / 0 / 0
Регистрация: 24.12.2015
Сообщений: 14
12.11.2018, 12:44  [ТС] 5
Цитата Сообщение от TRam_ Посмотреть сообщение
#include "stdafx.h" был выкинут? list.cpp удалил?
Да, все именно так, но ошибку все равно выдает ._.
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
12.11.2018, 12:49 6
Ту же или новую?
0
0 / 0 / 0
Регистрация: 24.12.2015
Сообщений: 14
12.11.2018, 12:51  [ТС] 7
Те же самые ошибки линковщика
Вторая ошибка:
"Ошибка LNK2019 ссылка на неразрешенный внешний символ "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class List<int> const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABV?$List@H@@@Z) в функции _main"
Может ошибка не в самой перегрузке и ее реализации? .-.
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
12.11.2018, 12:59 8
Лучший ответ Сообщение было отмечено Bash_B00M как решение

Решение

Аа... Всё понял. Нужно задавать не
C++
1
friend ostream& operator << (ostream &os, const List<T>&myList);
а
C++
1
template <typename T2>friend ostream& operator << (ostream &os, const List<T2>&myList);
потому что объявленная внешняя шаблонная friend-функция
C++
1
template <typename T> ostream& operator<<
не имеет никакого отношения к List<T>.

Добавлено через 5 минут
Конечно, в этом случае friend-функциями станут любые объявленные ostream& operator<<(ostream &os, const List<T2>&myList), в том числе с T2 отличающимся от T , которым параметризирован класс. Но уже с этим бороться наверно уже не получится, т.к. частичная специализация шаблонной функции (в отличии от класса) недопустима.
1
0 / 0 / 0
Регистрация: 24.12.2015
Сообщений: 14
12.11.2018, 13:06  [ТС] 9
Спасибо, все решилось
0
18842 / 9841 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
12.11.2018, 15:19 10
Цитата Сообщение от TRam_ Посмотреть сообщение
Конечно, в этом случае friend-функциями станут любые объявленные ostream& operator<<(ostream &os, const List<T2>&myList), в том числе с T2 отличающимся от T , которым параметризирован класс. Но уже с этим бороться наверно уже не получится, т.к. частичная специализация шаблонной функции (в отличии от класса) недопустима.
Почему? Специализация тут будет полная, а не частичная. Можно сделать так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <typename T>
ostream& operator<< (ostream & os, const List<T>& myList);
 
template <class T>
class List
{
    friend ostream& operator<< <>(ostream &os, const List<T>&myList);
};
 
template <typename T>
ostream& operator<< (ostream & os, const List<T>& myList)
{
   ...
}
1
12.11.2018, 15:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.11.2018, 15:19
Помогаю со студенческими работами здесь

Перегрузка cout<< для шаблонного класса
Перегрузка cout&lt;&lt; для шаблонного класса - это реально или нет?

Перегрузка оператора -> для шаблонного класса
Как это написать не понимаю помогите пожалуйста Добавлено через 23 секунды пример кода...

Перегрузка оператора вывода на консоль для шаблонного класса
Следующий код компилируется, но не линкуется: #include &lt;iostream&gt; using namespace std; ...

Перегрузить operator<<() для шаблонного класса (перегрузка оператора вывода)
Здравствуйте. Перегружаю оператор вывода для шаблонного класса. using namespace std; template...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru