19 / 19 / 1
Регистрация: 12.08.2011
Сообщений: 59
|
|||||||||||||||||||||
1 | |||||||||||||||||||||
Проблема наследования от шаблонного класса.31.08.2011, 02:13. Показов 12723. Ответов 17
Метки нет (Все метки)
Привет всем!
У меня есть шаблонный класс, и наследуемый от него шаблонный класс. Базовый:
error C2143: синтаксическая ошибка: отсутствие "," перед "<" в строке
0
|
31.08.2011, 02:13 | |
Ответы с готовыми решениями:
17
Как корректно передать в метод шаблонного класса объект шаблонного класса в качестве параметра? Вызов метода у шаблонного поля, шаблонного класса Инициализация шаблонного класса(В конструкторе класса после двоеточия вновь имя класса) Возможно ли создание объекта шаблонного класса в функции этого класса? |
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
||||||
31.08.2011, 02:28 | 2 | |||||
Похоже на неправильный порядок объявления классов.
В первом файле (ну, по-крайней мере по тому куску кода, что есть) подключать "Lgraph.h" и "Mgraph.h" ни к чему. там достаточно предварительного объявления шаблонов:
1
|
19 / 19 / 1
Регистрация: 12.08.2011
Сообщений: 59
|
|
31.08.2011, 02:33 [ТС] | 3 |
Теперь появляются 4 ошибки такого вида
error LNK2028: ссылка на неразрешенную лексему (0A000010) "public: virtual class Edge<class Vertex<int,int>,int> * __clrcall lgraph<class Edge<class Vertex<int,int>,int> >::g_insert_edge(class Edge<class Vertex<int,int>,int> *)" (?g_insert_edge@?$lgraph@V?$Edge@V?$Vertex@HH@@H@@@@$$FUAMPAV?$Edge@V?$Vertex@HH @@H@@PAV2@@Z) в функции "void __clrcall `dynamic initializer for 'const lgraph<class Edge<class Vertex<int,int>,int> >::`vftable'''(void)" (???__E??_7?$lgraph@V?$Edge@V?$Vertex@HH@@H@@@@6B@@@YMXXZ@?A0x0f4d3fa0@@$$FYMXXZ ) (((
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
||||||
31.08.2011, 02:41 | 4 | |||||
Это уже ошибки компоновщика, то есть програма уже компилируется.
В классе lgraph объявлена виртуальная функция g_insert_edge, но определения её нигде нет. И я не уверен, что в базовом классе деструктор стоит делать чистым. Я бы его просто виртуальным сделал, с пустым телом:
В общем, в любом случае, будет ли деструктор в базовом классе "чистой" функцией или нет, его обязательно надо определить.
1
|
19 / 19 / 1
Регистрация: 12.08.2011
Сообщений: 59
|
|
31.08.2011, 02:44 [ТС] | 5 |
Огромное спасибо, все вышеописанное помогло!
0
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
|
31.08.2011, 09:04 | 6 |
Ну да, деструктор же не наследуется. Так что Страуструп, мне кажется, погорячился, распространив на него понятие виртуальности, а тем более чистой виртуальности.
0
|
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
|
|
31.08.2011, 16:53 | 7 |
деструктор то как раз наследуется,
не наследуются конструкторы и оператор = по-моему .
0
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
|
31.08.2011, 19:42 | 8 |
0
|
13 / 13 / 2
Регистрация: 11.02.2011
Сообщений: 55
|
|
01.09.2011, 09:42 | 9 |
Да вы оба хороши, рассуждать, наследуется или не наследуется деструктор - это сильно.
0
|
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
|
|
01.09.2011, 11:25 | 10 |
Alex1234, а што такова?
Mr.X, problem officer? пс: как тут картинки прикреплять?
0
|
Заблокирован
|
|
01.09.2011, 11:35 | 11 |
наследуется виртуальность\невиртуальность. Деструктор по умолчанию - невиртуальный. Сами деструкторы не наследуются.
0
|
13 / 13 / 2
Регистрация: 11.02.2011
Сообщений: 55
|
|
01.09.2011, 12:35 | 12 |
Извините если кого задел. Вот все что я думаю:
Каждый производный класс при своем уничтожении вызывает деструктор базового класса. Если деструктор базового класса объявляется виртуальным, то и все деструкторы последующих производных классов будут виртуальными. Более того деструктор базового класса может быть чисто виртуальной функцией. Но при этом в отличии от обычных чисто виртуальных функций чисто виртуальный деструктор всегда должен иметь определение, так как деструкторы производных классов неявно вызывают деструктор базового класса. Ключевое слово virtual можно опускать для виртуальных функций, унаследованных от базового класса, в производных классах. Может чего и упустил. Фразы вида "Деструкторы не наследуются" выносят мозг.
0
|
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
|
|
01.09.2011, 13:21 | 13 |
LosAngeles, не очень понял к чему это?
деструктор по моему такая обычная функция как и все и наследуется, т.к её можно явно вызвать из производного класса * Alex1234, всё норм. ага, теперь понял что имел ввиду ЛосАнжелес . где-то читал подобное, но толковых примеров не видел. примерчик можно? * по-моему там есть разница с ключевым словом или нет... * так вы всё таки на стороне зла или добра? по вопросам отмеченным звездой хотелось бы услышать мнение эксперта, т.к сам плохо разбераюсь в сабже. желательно с ссылкой на авторитетный источник. спасибо.
0
|
13 / 13 / 2
Регистрация: 11.02.2011
Сообщений: 55
|
||||||||||||
01.09.2011, 13:49 | 14 | |||||||||||
> где-то читал подобное, но толковых примеров не видел. примерчик можно? *
Нет, если в каком нибудь классе метод был виртуальным, таковым он будет и в производных, модификатор virtual стоит указывать явно, чтоб не вводить никого в заблуждение. > так вы всё таки на стороне зла или добра? Кода нибудь я познаю светлую сторону силы. Добавлено через 18 минут Мда, выражение "Деструкторы не наследуются" присутствует в литераторе, наверно это мои личные проблемы, ну да фиг с ним.
1
|
Заблокирован
|
|
01.09.2011, 13:51 | 15 |
final draft С++11
3242
A destructor can be declared virtual (10.3) or pure virtual (10.4); if any objects of that class or any derived class are created in the program, the destructor shall be defined. After executing the body of the destructor and destroying any automatic objects allocated within the body, a destructor for class X calls the destructors for X’s direct non-variant members, the destructors for X’s direct base classes and, if X is the type of the most derived class (12.6.2), its destructor calls the destructors for X’s virtual base classes. All destructors are called as if they were referenced with a qualified name, that is, ignoring any possible virtual overriding destructors in more derived classes. Bases and members are destroyed in the reverse order of the completion of their constructor
1
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
01.09.2011, 13:55 | 16 |
Имеется в виду, что каждый производный класс будет иметь собственный деструктор, описанный явно или сгенерированный компилятором. В отличие от всех остальных виртуальных функций, которые могут быть замещены, а могут просто унаследоваться без изменений. С деструктором такой номер не проходит и он создаётся всегда.
0
|
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
|
|
01.09.2011, 15:12 | 17 |
Alex1234, ага
вот это хорошо LosAngeles, спасибо, ну что касается фразы "...так как деструкторы производных классов неявно вызывают деструктор базового класса." это случайно попало в цитату
1
|
13 / 13 / 2
Регистрация: 11.02.2011
Сообщений: 55
|
|
01.09.2011, 15:38 | 18 |
Ну, не сосем случайно, а как без неё?
0
|
01.09.2011, 15:38 | |
01.09.2011, 15:38 | |
Помогаю со студенческими работами здесь
18
Чем отличается шаблонный метод класса от шаблонного класса? Partial шаблонного класса (Весь основной код класса вынести в другой файл) Создание своего класса кнопки с использованием наследования от класса UserControl Обявление шаблонного класса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |