136 / 48 / 2
Регистрация: 31.07.2014
Сообщений: 238
|
||||||
1 | ||||||
Переопределение метода класса-шаблона04.09.2014, 21:57. Показов 4209. Ответов 20
Метки нет (Все метки)
Привет народ. Есть такой код:
0
|
04.09.2014, 21:57 | |
Ответы с готовыми решениями:
20
Определение метода-шаблона за пределами шаблона класса Синтаксис определения метода специализии шаблона класса. Вынос реализации метода шаблона класса в другой файл Передача метода класса в качестве параметра для метода другого класса |
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
||||||
04.09.2014, 22:16 | 2 | |||||
Вообще-то, тут что-то не логичное. TProc1 - синоним типа OS::process<OS::pr0, 90>. Proc1 - стало быть экземпляр этого типа. И третья строка совсем этим не стыкуется. То же самое, что написать:
0
|
136 / 48 / 2
Регистрация: 31.07.2014
Сообщений: 238
|
|
04.09.2014, 22:21 [ТС] | 3 |
Тем не менее - это строчка из примера для запуска процесса операционки scmRTOS (для микроконтроллеров, но C++ он и в Африке).
0
|
136 / 48 / 2
Регистрация: 31.07.2014
Сообщений: 238
|
|
04.09.2014, 22:38 [ТС] | 5 |
Вот ссылка на sourceforge:
http://sourceforge.net/project... r/download Там зайти в AVR\GCC\MEGA\3-Channel\main.c Или вот, именно кусочек того что тебе нужно, чтобы не рыться: https://cloud.mail.ru/public/8... %2FMEGA.7z
0
|
Модератор
5197 / 2079 / 406
Регистрация: 06.01.2013
Сообщений: 4,793
|
|
04.09.2014, 22:59 | 6 |
NoobsEnslaver, либо ссылка не та, либо что-то совсем странное. Ибо я вижу только пример с Тип::метод
0
|
136 / 48 / 2
Регистрация: 31.07.2014
Сообщений: 238
|
||||||
04.09.2014, 23:35 [ТС] | 7 | |||||
Ну как же, точно 3-Channel\src\main.c смотрел?
Вот оттуда фрагменты:
0
|
136 / 48 / 2
Регистрация: 31.07.2014
Сообщений: 238
|
|
05.09.2014, 00:02 [ТС] | 9 |
Да да да... недосмотрел я эту Т Спасибо) Ну ладно, а дальше по сабжу - я правильно истолковал, кроме момента с потерянной "Т" код? И еще - зачем при переопределении exec() вначале ставится template<>? Не совсем понимаю этот механизм..
0
|
18829 / 9832 / 2403
Регистрация: 30.01.2014
Сообщений: 17,267
|
|||||||||||
05.09.2014, 01:42 | 10 | ||||||||||
Затем, что OS:: process - это шаблон.
А
0
|
136 / 48 / 2
Регистрация: 31.07.2014
Сообщений: 238
|
||||||
05.09.2014, 09:06 [ТС] | 12 | |||||
Всётаки еще не понятно - во-первых почему вначале мы ставим template<>, хотя дальше у нас и так идет конкретизация шаблона <OS:r0, 120>, во-вторых - не возникнет проблем из за того, что мы сначала создали объект класса, а потом переопределили ему метод? И в-третьих, ну эт немного по-нубски, но всёже - разве создание объекта класса происходит не так
0
|
18829 / 9832 / 2403
Регистрация: 30.01.2014
Сообщений: 17,267
|
||||||||||||||||||||||||||||||||||||
05.09.2014, 10:32 | 13 | |||||||||||||||||||||||||||||||||||
Сообщение было отмечено NoobsEnslaver как решение
Решение
Это специализация функции шаблона. Явное инстанцирование тут происходит вследствие нее.
Явно инстанцировать такой метод можно несколькими способами. Первый способ написать явное инстанцирование для всего класса
Поэтому мы воспользовались специализией (но явное инстанцирование от этого не перестало происходить).
Вот такая запись же тебя не смущает:
Ты привел пример создания объекта в куче (heap). Это не единственный способ.
4
|
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|||||||||||
06.09.2014, 01:13 | 14 | ||||||||||
DrOffset, я правильно понял, что явное инстанцирование функции происходит тогда, когда компилятор встречает именно определение явной специализации, а не объявление (в отличие от такого явного инстанцирования:
0
|
18829 / 9832 / 2403
Регистрация: 30.01.2014
Сообщений: 17,267
|
||||||
06.09.2014, 01:29 | 15 | |||||
Такое инстанцирование всегда требует наличие доступного определения в данной единице трансляции (без него оно не должно компилироваться). Поэтому чисто технически нет никакой разницы. Разница в примере ТС в том, что мы явно инстанцировали три разные версии функций (в смысле с разным телом), использовав явную специализацию функции. В отличие от инстанцирования трех одинаковых (в смысле по одному и тому же шаблону) функций, в случае использования такого синтаксиса:
0
|
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|
06.09.2014, 01:48 | 16 |
Компилируется, но экземпляр шаблона, как я понял, не создаётся (студия 10).
И то и другое требует этого. Но: Добавлено через 5 минут Я почему прицепился: подумал, что в 10 посте приведены объявления специализаций, и написано:
0
|
18829 / 9832 / 2403
Регистрация: 30.01.2014
Сообщений: 17,267
|
|
06.09.2014, 02:05 | 17 |
Объявление и определение - это не одно и то же.
Объявление там в основном шаблоне, вынесено в h-файл. Определения там три, для каждой специализации. Но т.к. специализация явная, то она приводит к инстацированию (генерации) функций. Я специально указал сперва синтаксическое определение, а затем в скобочках эффект, который при этом достигается. Этого собственно и добивался автор. Вызов метода exec из другой единицы трансляции не будет приводить к инстацированию, вместо этого будут использованы уже инстацированные функции из модуля, который мы тут рассматривали. Я понимаю, что тебя сбило с толку не "книжное" изложение материала. Но это не расходится с теорией, т.к. механизмы все взаимосвязаны и здесь важно понимать что именно происходит при тех или иных действиях, а не просто запоминать и ассоциировать поведение с определенным синтаксисом. Добавлено через 5 минут Да, сейчас попробовал в 2012 студии, выдал только warning:
1
|
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
||||||
06.09.2014, 02:13 | 18 | |||||
Нет. Там в main.cpp объявления специализаций прописаны:
Нет, меня сбило то, что я неправильно понял код из 10 поста, подумал, что там приведено объявление специализаци, и дальше написано: , что не так, так как:
0
|
18829 / 9832 / 2403
Регистрация: 30.01.2014
Сообщений: 17,267
|
||||||
06.09.2014, 02:21 | 19 | |||||
typedef - Это не объявления.
Или ты про то, что в #if 0? Добавлено через 3 минуты Это еще почему? Что-то от тебя ускользнула похоже мысль. Определение явной специализации, вот оно:
0
|
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
||||||
06.09.2014, 02:25 | 20 | |||||
Да.
Добавлено через 3 минуты DrOffset, это от тебя моя мысль ускальзывает. Давай так. Если было бы вот так написано, это было бы правильно?
0
|
06.09.2014, 02:25 | |
06.09.2014, 02:25 | |
Помогаю со студенческими работами здесь
20
Переопределение виртуального метода Наследование. Переопределение метода родителя Вызов метода класса из метода другого класса Явное создание экземпляра класса и явная специализация шаблона класса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |