crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
kuler
  опции профиля:
сообщение 18.2.2009, 19:19
Сообщение #1


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


есть к примеру
template<class Type> class CClass
{

public:
  Type* val;
  void met();
};
template<class Type> void CClass<Type>::met()
{
  ShowMessage(*val);
}

можно както не писать в заголовке метода template<class Type> void CClass<Type>::met() учитывая что в самом методе параметр типа не нужен?
(хотелось бы void CClass::met())
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 19.2.2009, 9:09
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Так?
template<class Type> class CClass
{

public:
  Type* val;
  void met() {
    ShowMessage(*val);
  }
};


1. В твоём коде тип нужен: каким образом компилятор узнает тип val?
2. Даже в том случае, если в методе тип таки не используется, сам метод может отличатся для разных типов. Каким образом компилятор узнает для какого именно типа этот метод предназначен?

Сообщение отредактировал Tonal - 19.2.2009, 9:10
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 19.2.2009, 10:45
Сообщение #3


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


Цитата(Tonal @ 19.2.2009, 9:09) *
Так?

нет, забыл написать чтобы было разделение на cpp и h. Соответственно реализация вне описания.
Цитата(Tonal @ 19.2.2009, 9:09) *
В твоём коде тип нужен: каким образом компилятор узнает тип val?

посмотрит на объявление класса
Цитата(Tonal @ 19.2.2009, 9:09) *
Каким образом компилятор узнает для какого именно типа этот метод предназначен?

ну вот если идет специализация (ты же про неё?) то тогда можно и указать а по умолчанию тот же самый что в заголовке класса
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 19.2.2009, 18:04
Сообщение #4


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


ну что, никто круто шаблоны не знает?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 19.2.2009, 18:08
Сообщение #5


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

Спасибо сказали: 28 раз(а)




Репутация:   3  


Цитата(kuler @ 19.2.2009, 9:45) *
нет, забыл написать чтобы было разделение на cpp и h. Соответственно реализация вне описания.

нельзя в шаблонах выносить реализацию отдельно от описания, я почти уверен что ни один компилятор не скомпилит отдельную реализацию от описания
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 19.2.2009, 18:11
Сообщение #6


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


ну мой код компилится и работает
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 19.2.2009, 20:12
Сообщение #7


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


кстати нашел уже неплохой метод - в студии можно добавлять методы через "add method" и шаблоны там поддерживаются, соответственно вручную писать не надо
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 19.2.2009, 21:57
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(void*)
нельзя в шаблонах выносить реализацию отдельно от описания, я почти уверен что ни один компилятор не скомпилит отдельную реализацию от описания

Можно. Шаблоны необходимо описывать в inl-файлах, а потом добавлять в header в конце, после всего кода.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 19.2.2009, 21:59
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(AD @ 20.2.2009, 0:57) *
в inl-файлах
такие файлы относятся к студии или к C++ компиляторам?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 19.2.2009, 22:02
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(Litkevich Yuriy @ 19.2.2009, 21:59) *
Цитата(AD @ 20.2.2009, 0:57) *
в inl-файлах
такие файлы относятся к студии или к C++ компиляторам?

нет к visual studio не относятся. Вещь эта работала и в студии, и борланде, и если не ошибаюсь, в g++!

Сообщение отредактировал AD - 19.2.2009, 22:03
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 20.2.2009, 9:44
Сообщение #11


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Цитата(kuler @ 19.2.2009, 13:45) *
нет, забыл написать чтобы было разделение на cpp и h. Соответственно реализация вне описания.

Это называется export template и поддерживается только комой.
(подсказка, попробуй вызвать свою метод met из другого cpp и с другим типом чем он реализован.

Цитата(kuler @ 19.2.2009, 13:45) *
Цитата(Tonal @ 19.2.2009, 9:09) *
В твоём коде тип нужен: каким образом компилятор узнает тип val?

посмотрит на объявление класса

У тебя нет класса, есть шаблон класса и там тип val не указан.
Для разных типов объектный код функции может существенно отличатся друг от друга. Т.е. не зная какой тип будет подставлен вместо Type в общем случае невозможно создать объектный код для шаблона метода met.
Стало быть помещать его шаблонную реализацию в отдельно компилируемый файл не имеет смысла.
Именно по этому большинство компиляторов не поддерживают export template.

Цитата(kuler @ 19.2.2009, 13:45) *
Цитата(Tonal @ 19.2.2009, 9:09) *
Каким образом компилятор узнает для какого именно типа этот метод предназначен?

ну вот если идет специализация (ты же про неё?) то тогда можно и указать а по умолчанию тот же самый что в заголовке класса

Есть полная специализация, частичная специализация и совмещение (перегрузка).
Боюсь, что такое опускание усложнит правила реализации компилятора и понимание кода.
Например хотя спецификатор virtual перед методом производного класса можно опускать, тем не менее многие советуют его таки писать - это сильно упрощает восприятие интерфейсов. :)

П.С. Да, add method к С++ отношения не имеет. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 20.2.2009, 11:03
Сообщение #12


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


Цитата(Tonal @ 20.2.2009, 9:44) *
Да, add method к С++ отношения не имеет.

весь вопрос был изза того что в ломы лишнюю по моему мнению фигню писать, а это как раз избавляет от необходимости
Цитата(AD @ 19.2.2009, 21:57) *
Шаблоны необходимо описывать в inl-файлах,

это вообще не понял чо такое

Цитата(Tonal @ 20.2.2009, 9:44) *
и с другим типом чем он реализован.

что значит сия фраза?

Цитата(Tonal @ 20.2.2009, 9:44) *
попробуй вызвать свою метод met из другого cpp

ага, он типа пишет анрезолв?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 20.2.2009, 11:39
Сообщение #13


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Есть очень хорошая книга: Шаблоны C++: справочник разработчика.
Там всё это очень хорошо описано.
Хотя для начала лучше почитать Страуструпа, Мейерса и Саттера. :)

Сообщение отредактировал Tonal - 20.2.2009, 11:39
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 20.2.2009, 12:11
Сообщение #14


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(kuler @ 20.2.2009, 11:03) *
Цитата(AD)
Шаблоны необходимо описывать в inl-файлах,

это вообще не понял чо такое

Такой же файл, как и h-file, cpp-file, c-file! Ничем не отличается. Объявление пишешь в этом файле, подключаешь его в cpp или в h файле (точно не помню), а в cpp-файле пишешь реализацию. Но а вообще эти шаблоны лучше вместе писать, как тебе посоветовал Tonal
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 20.2.2009, 16:26
Сообщение #15


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


Цитата(AD @ 20.2.2009, 12:11) *
лучше вместе писать, как тебе посоветовал Tonal

да, но получается что в хедере будет вся реализация и он может быть к примеру 8000 строк, что убивает весь смысл хидеров
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 20.2.2009, 17:04
Сообщение #16


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(kuler @ 20.2.2009, 16:26) *
да, но получается что в хедере будет вся реализация и он может быть к примеру 8000 строк, что убивает весь смысл хидеров

Тогда постарайся понять о чем я говорю и сделай так, как я сказал. Вроде бы все понятно объяснил! :)

Сообщение отредактировал AD - 20.2.2009, 17:05
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrew Selivanov
  опции профиля:
сообщение 26.2.2009, 13:53
Сообщение #17


Участник
**

Группа: Участник
Сообщений: 249
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 3

Спасибо сказали: 15 раз(а)




Репутация:   6  


Цитата(kuler @ 20.2.2009, 16:26) *
Цитата(AD @ 20.2.2009, 12:11) *
лучше вместе писать, как тебе посоветовал Tonal

да, но получается что в хедере будет вся реализация и он может быть к примеру 8000 строк, что убивает весь смысл хидеров

У шаблонов не предусмотрена реализация, потому что шаблон - это именно шаблон, то есть нужная реализация генерируется автоматически. Здесь концепция шабона пересекается с концепцией заголовочных файлов... :)
Вообще тут выше порекомендовали очень правильную книгу на эту тему, большинство вопросов там освещено. Десятая глава.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 3.3.2009, 11:26
Сообщение #18


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


kuler, удалось сделать?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 3.3.2009, 16:12
Сообщение #19


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


AD, плюнул, ибо меня не устраивает отсутствие безгеморройного разбиения на срр и h. Как нить в другой раз чо нить напишу.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 24.6.2025, 14:21