![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
kuler |
![]()
Сообщение
#1
|
![]() Танцор диско ![]() ![]() ![]() Группа: Участник Сообщений: 441 Регистрация: 11.9.2008 Из: Москва Пользователь №: 289 Спасибо сказали: 6 раз(а) Репутация: ![]() ![]() ![]() |
есть к примеру
можно както не писать в заголовке метода template<class Type> void CClass<Type>::met() учитывая что в самом методе параметр типа не нужен? (хотелось бы void CClass::met()) |
|
|
![]() |
Tonal |
![]()
Сообщение
#2
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: ![]() ![]() ![]() |
Так?
1. В твоём коде тип нужен: каким образом компилятор узнает тип val? 2. Даже в том случае, если в методе тип таки не используется, сам метод может отличатся для разных типов. Каким образом компилятор узнает для какого именно типа этот метод предназначен? Сообщение отредактировал Tonal - 19.2.2009, 9:10 |
|
|
kuler |
![]()
Сообщение
#3
|
![]() Танцор диско ![]() ![]() ![]() Группа: Участник Сообщений: 441 Регистрация: 11.9.2008 Из: Москва Пользователь №: 289 Спасибо сказали: 6 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(Tonal @ 19.2.2009, 9:09) Link Так? нет, забыл написать чтобы было разделение на cpp и h. Соответственно реализация вне описания. Цитата(Tonal @ 19.2.2009, 9:09) Link В твоём коде тип нужен: каким образом компилятор узнает тип val? посмотрит на объявление класса Цитата(Tonal @ 19.2.2009, 9:09) Link Каким образом компилятор узнает для какого именно типа этот метод предназначен? ну вот если идет специализация (ты же про неё?) то тогда можно и указать а по умолчанию тот же самый что в заголовке класса |
|
|
kuler |
![]()
Сообщение
#4
|
![]() Танцор диско ![]() ![]() ![]() Группа: Участник Сообщений: 441 Регистрация: 11.9.2008 Из: Москва Пользователь №: 289 Спасибо сказали: 6 раз(а) Репутация: ![]() ![]() ![]() |
ну что, никто круто шаблоны не знает?
|
|
|
void* |
![]()
Сообщение
#5
|
![]() Программист-самоучка ![]() ![]() ![]() Группа: Участник Сообщений: 429 Регистрация: 4.6.2008 Пользователь №: 193 Спасибо сказали: 28 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(kuler @ 19.2.2009, 9:45) Link нет, забыл написать чтобы было разделение на cpp и h. Соответственно реализация вне описания. нельзя в шаблонах выносить реализацию отдельно от описания, я почти уверен что ни один компилятор не скомпилит отдельную реализацию от описания |
|
|
kuler |
![]()
Сообщение
#6
|
![]() Танцор диско ![]() ![]() ![]() Группа: Участник Сообщений: 441 Регистрация: 11.9.2008 Из: Москва Пользователь №: 289 Спасибо сказали: 6 раз(а) Репутация: ![]() ![]() ![]() |
ну мой код компилится и работает
|
|
|
kuler |
![]()
Сообщение
#7
|
![]() Танцор диско ![]() ![]() ![]() Группа: Участник Сообщений: 441 Регистрация: 11.9.2008 Из: Москва Пользователь №: 289 Спасибо сказали: 6 раз(а) Репутация: ![]() ![]() ![]() |
кстати нашел уже неплохой метод - в студии можно добавлять методы через "add method" и шаблоны там поддерживаются, соответственно вручную писать не надо
|
|
|
AD |
![]()
Сообщение
#8
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(void*) нельзя в шаблонах выносить реализацию отдельно от описания, я почти уверен что ни один компилятор не скомпилит отдельную реализацию от описания Можно. Шаблоны необходимо описывать в inl-файлах, а потом добавлять в header в конце, после всего кода. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#9
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(AD @ 20.2.2009, 0:57) Link в inl-файлах такие файлы относятся к студии или к C++ компиляторам?
|
|
|
AD |
![]()
Сообщение
#10
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(Litkevich Yuriy @ 19.2.2009, 21:59) Link Цитата(AD @ 20.2.2009, 0:57) Link в inl-файлах такие файлы относятся к студии или к C++ компиляторам?нет к visual studio не относятся. Вещь эта работала и в студии, и борланде, и если не ошибаюсь, в g++! Сообщение отредактировал AD - 19.2.2009, 22:03 |
|
|
Tonal |
![]()
Сообщение
#11
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(kuler @ 19.2.2009, 13:45) Link нет, забыл написать чтобы было разделение на cpp и h. Соответственно реализация вне описания. Это называется export template и поддерживается только комой. (подсказка, попробуй вызвать свою метод met из другого cpp и с другим типом чем он реализован. Цитата(kuler @ 19.2.2009, 13:45) Link Цитата(Tonal @ 19.2.2009, 9:09) Link В твоём коде тип нужен: каким образом компилятор узнает тип val? посмотрит на объявление класса У тебя нет класса, есть шаблон класса и там тип val не указан. Для разных типов объектный код функции может существенно отличатся друг от друга. Т.е. не зная какой тип будет подставлен вместо Type в общем случае невозможно создать объектный код для шаблона метода met. Стало быть помещать его шаблонную реализацию в отдельно компилируемый файл не имеет смысла. Именно по этому большинство компиляторов не поддерживают export template. Цитата(kuler @ 19.2.2009, 13:45) Link Цитата(Tonal @ 19.2.2009, 9:09) Link Каким образом компилятор узнает для какого именно типа этот метод предназначен? ну вот если идет специализация (ты же про неё?) то тогда можно и указать а по умолчанию тот же самый что в заголовке класса Есть полная специализация, частичная специализация и совмещение (перегрузка). Боюсь, что такое опускание усложнит правила реализации компилятора и понимание кода. Например хотя спецификатор virtual перед методом производного класса можно опускать, тем не менее многие советуют его таки писать - это сильно упрощает восприятие интерфейсов. ![]() П.С. Да, add method к С++ отношения не имеет. ![]() |
|
|
kuler |
![]()
Сообщение
#12
|
![]() Танцор диско ![]() ![]() ![]() Группа: Участник Сообщений: 441 Регистрация: 11.9.2008 Из: Москва Пользователь №: 289 Спасибо сказали: 6 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(Tonal @ 20.2.2009, 9:44) Link Да, add method к С++ отношения не имеет. весь вопрос был изза того что в ломы лишнюю по моему мнению фигню писать, а это как раз избавляет от необходимости Цитата(AD @ 19.2.2009, 21:57) Link Шаблоны необходимо описывать в inl-файлах, это вообще не понял чо такое Цитата(Tonal @ 20.2.2009, 9:44) Link и с другим типом чем он реализован. что значит сия фраза? Цитата(Tonal @ 20.2.2009, 9:44) Link попробуй вызвать свою метод met из другого cpp ага, он типа пишет анрезолв? |
|
|
Tonal |
![]()
Сообщение
#13
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: ![]() ![]() ![]() |
Есть очень хорошая книга: Link.
Там всё это очень хорошо описано. Хотя для начала лучше почитать Страуструпа, Мейерса и Саттера. ![]() Сообщение отредактировал Tonal - 20.2.2009, 11:39 |
|
|
AD |
![]()
Сообщение
#14
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(kuler @ 20.2.2009, 11:03) Link Цитата(AD) Шаблоны необходимо описывать в inl-файлах, это вообще не понял чо такое Такой же файл, как и h-file, cpp-file, c-file! Ничем не отличается. Объявление пишешь в этом файле, подключаешь его в cpp или в h файле (точно не помню), а в cpp-файле пишешь реализацию. Но а вообще эти шаблоны лучше вместе писать, как тебе посоветовал Tonal |
|
|
kuler |
![]()
Сообщение
#15
|
![]() Танцор диско ![]() ![]() ![]() Группа: Участник Сообщений: 441 Регистрация: 11.9.2008 Из: Москва Пользователь №: 289 Спасибо сказали: 6 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(AD @ 20.2.2009, 12:11) Link лучше вместе писать, как тебе посоветовал Tonal да, но получается что в хедере будет вся реализация и он может быть к примеру 8000 строк, что убивает весь смысл хидеров |
|
|
AD |
![]()
Сообщение
#16
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(kuler @ 20.2.2009, 16:26) Link да, но получается что в хедере будет вся реализация и он может быть к примеру 8000 строк, что убивает весь смысл хидеров Тогда постарайся понять о чем я говорю и сделай так, как я сказал. Вроде бы все понятно объяснил! ![]() Сообщение отредактировал AD - 20.2.2009, 17:05 |
|
|
Andrew Selivanov |
![]()
Сообщение
#17
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 249 Регистрация: 9.10.2007 Из: Москва Пользователь №: 3 Спасибо сказали: 15 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(kuler @ 20.2.2009, 16:26) Link Цитата(AD @ 20.2.2009, 12:11) Link лучше вместе писать, как тебе посоветовал Tonal да, но получается что в хедере будет вся реализация и он может быть к примеру 8000 строк, что убивает весь смысл хидеров У шаблонов не предусмотрена реализация, потому что шаблон - это именно шаблон, то есть нужная реализация генерируется автоматически. Здесь концепция шабона пересекается с концепцией заголовочных файлов... ![]() Вообще тут выше порекомендовали очень правильную книгу на эту тему, большинство вопросов там освещено. Десятая глава. |
|
|
AD |
![]()
Сообщение
#18
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
kuler, удалось сделать?
|
|
|
kuler |
![]()
Сообщение
#19
|
![]() Танцор диско ![]() ![]() ![]() Группа: Участник Сообщений: 441 Регистрация: 11.9.2008 Из: Москва Пользователь №: 289 Спасибо сказали: 6 раз(а) Репутация: ![]() ![]() ![]() |
AD, плюнул, ибо меня не устраивает отсутствие безгеморройного разбиения на срр и h. Как нить в другой раз чо нить напишу.
|
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 11.8.2025, 14:24 |