3 / 3 / 2
Регистрация: 05.01.2014
Сообщений: 16
1

Friend template class with template class argument

17.03.2017, 20:57. Показов 1184. Ответов 10

Помогите подружить 2 класса:
Имеется класс Student:
C++
1
2
3
4
5
template <class _T> class Faculty;
class Student{
   friend Faculty<Student>;
   //...
};
Он передается шаблонному классу Faculty:
C++
1
2
3
4
5
6
7
class Student;
template <template <class> class T> Faculties;
template <class _T> class Faculty{
   friend Faculties<Faculty>; // ошибка: Template argument for template template parameter must be a class template or type alias template
   //friend Faculties<Faculty<Student>>; // ошибка: Template argument for template template parameter must be a class template or type alias template
   //...
}
Он передается шаблонному классу Faculties:
C++
1
2
3
template <template <class> class T> class Faculties{
   //...
};
Нужно Faculty подружить с Faculties
Все разделено на файлы, объявления в хедерах, каждый в своем.
Конструкторы каждого класса и их функции в отдельных файлах.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.03.2017, 20:57
Ответы с готовыми решениями:

Ошибки: 1) use of class template requires template argument list 2) 'T' : undeclared identifier
Решил подправить свой класс с использованием шаблонов, но столкнулся со следующим косяком. Если я...

'MyQueue' : use of class template requires template argument list
Написал код про шаблоны. Не могу понять почему выводит ошибку во время наследования класса. ошибки...

Не пойму конструкцию template <template <class T> class X>
Что это за шаблон такой?

В чем различие template <typename T> от template <class T> ?
Добрый день ! Заметил в новых книгах применение записи template &lt;typename T&gt; вместо template...

10
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
17.03.2017, 22:37 2
похоже забыли class перед Faculties:
template <template <class> class T> class Faculties;
http://cpp.sh/53xc
0
3 / 3 / 2
Регистрация: 05.01.2014
Сообщений: 16
17.03.2017, 23:08  [ТС] 3
Действительно пропустил, но ошибка осталась.
Сейчас скину весь проект
0
3 / 3 / 2
Регистрация: 05.01.2014
Сообщений: 16
17.03.2017, 23:13  [ТС] 4
Проект xCode
Буду рад услышать критику и рекомендации по написанию кода.
Плюс хотелось бы переезжать на современный стандарт, где это можно. Что порекомендуете?
Еще преподаватель говорила про умные указатели - не особо понимаю зачем и где здесь их стоит применять.
Спасибо
Вложения
Тип файла: zip FacultyStudentsList.zip (44.9 Кб, 3 просмотров)
0
Вездепух
Эксперт CЭксперт С++
10820 / 5841 / 1585
Регистрация: 18.10.2014
Сообщений: 14,497
17.03.2017, 23:48 5
Цитата Сообщение от Sandr1x Посмотреть сообщение
ошибка осталась.
Какая именно ошибка?

Вот тут написана ерунда

C++
1
2
3
4
    template <template <class _T> class T> class Faculties{
        private:
        protected:
            T<class _T>     *_head,
Тут и везде далее class _T - это предварительное объявление некоего class _T, которого у вас в программе нет вообще.

Мне в упор не ясно, зачем ваш class Faculties параметризован именно шаблоном, а не обычным типом. Зачем? Шаблоны нужны для того, чтобы их потом специализировать с разными аргументами. У вас в реализации Faculties шаблон T нигде не специализируется с разными аргументами. Так зачем тогда T сделан шаблоном, а не просто типом?
0
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
17.03.2017, 23:56 6
посмотрел в код. какой-то адский коктейль.
самая безобидная ошибка: методы шаблонов реализуйте в hpp файлах, а не в cpp.
Далее, классы студентов, факультетов чем-то напоминают шаблонные списки, хотя таковыми быть не должны согласно здравому смыслу. Если вам надо написать шаблонный класс списка - то пишите шаблонный класс списка. И параметризируйте его студентами там или факультетами или еще чем хотите. Здесь есть тема с решениями всяких задачек, в том числе и шаблонные списки. Доводить до компилябельности и до работоспособности то в том виде, в каком оно сейчас нет смысла.
0
Вездепух
Эксперт CЭксперт С++
10820 / 5841 / 1585
Регистрация: 18.10.2014
Сообщений: 14,497
17.03.2017, 23:58 7
Цитата Сообщение от DU3 Посмотреть сообщение
самая безобидная ошибка: методы шаблонов реализуйте в hpp файлах, а не в cpp.
Автор, очевидно, в курсе этого момента, ибо он включает .cpp файлы с реализацией шаблона в другие .cpp файлы там, где это нужно. Т.е. ошибки тут нет. Практика нормальная, но вот давать таким файлам расширение .cpp - не самая лучшая идея.

Циркулярное включение заголовков в коде, однако, присутствует. Зачем - не ясно.
0
3 / 3 / 2
Регистрация: 05.01.2014
Сообщений: 16
18.03.2017, 13:52  [ТС] 8
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Какая именно ошибка?

Вот тут написана ерунда

C++
1
2
3
4
    template <template <class _T> class T> class Faculties{
        private:
        protected:
            T<class _T>     *_head,
Тут и везде далее class _T - это предварительное объявление некоего class _T, которого у вас в программе нет вообще.

Мне в упор не ясно, зачем ваш class Faculties параметризован именно шаблоном, а не обычным типом. Зачем? Шаблоны нужны для того, чтобы их потом специализировать с разными аргументами. У вас в реализации Faculties шаблон T нигде не специализируется с разными аргументами. Так зачем тогда T сделан шаблоном, а не просто типом?
Классы шаблонные, потому что преподаватель так хочет, это курсач. Сказала, чтобы в шаблоны передавались вложенные классы, т.е Student->Faculty->Faculties.
Student - класс, в котором хранится информация о студенте.
Faculty - класс, в котором хранится список студентов.
Faculties - класс, в котором хранится список факультетов.
0
3 / 3 / 2
Регистрация: 05.01.2014
Сообщений: 16
18.03.2017, 14:36  [ТС] 9
Цитата Сообщение от DU3 Посмотреть сообщение
посмотрел в код. какой-то адский коктейль.
самая безобидная ошибка: методы шаблонов реализуйте в hpp файлах, а не в cpp.
Далее, классы студентов, факультетов чем-то напоминают шаблонные списки, хотя таковыми быть не должны согласно здравому смыслу. Если вам надо написать шаблонный класс списка - то пишите шаблонный класс списка. И параметризируйте его студентами там или факультетами или еще чем хотите. Здесь есть тема с решениями всяких задачек, в том числе и шаблонные списки. Доводить до компилябельности и до работоспособности то в том виде, в каком оно сейчас нет смысла.
По поводу компиляберного кода, то, если не использовать класс Faculties, то все работает. Приложил
Вложения
Тип файла: zip FacultyStudentsList 2.zip (39.5 Кб, 1 просмотров)
0
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
18.03.2017, 19:15 10
или вы неправильно поняли препода, или ваш препод идиот. потакать идиотам - сомнительное удовольствие. из описания пока что понятно что единственное место для шаблонов - сделать шаблонный список аля std::list и использовать как-то так:
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
26
template <typename T>
class List
{
  ... // implement
};
 
class Student
{ 
  ... // инфа о студенте
};
 
 
class Faculty
{
   List<Student> m_students;
 
   ... // прочее
};
 
 
class Faculties
{
   List<Faculty> m_faculties;
 
   ... // прочее
};
0
Вездепух
Эксперт CЭксперт С++
10820 / 5841 / 1585
Регистрация: 18.10.2014
Сообщений: 14,497
18.03.2017, 21:53 11
Цитата Сообщение от Sandr1x Посмотреть сообщение
Сказала, чтобы в шаблоны передавались вложенные классы
Прекрасно. Вот у вас в шаблон Faculty передается класс. А вот в шаблон Faculties передается шаблон. Почему вдруг шаблон, а не класс, как в Faculty?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.03.2017, 21:53
Помогаю со студенческими работами здесь

Template argument required for class "LinkedListIterator"
#ifndef LINKEDLIST_H #define LINKEDLIST_H #include &lt;iostream&gt; using namespace std; template...

Template class
Возможно ли разделить шаблонный класс на два файла так, что в одном из файлов буду объявления, а в...

template <class T>
Куда вставлять template &lt;class T&gt; при определении функций, принимающих аргументы типа...

Ошибка с template <class T>
Доброго времени суток! Изучаю С++ и не совсем разобрался с template. Вернее, я думаю, что понял,...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru