![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 1 Всего: 20 |
Вот вопрос, почему перед каждым определением члена-функции класса-шаблона надо употреблять оператор template<class T> ? Ведь это неудобно, крайне. Я уже задефайнел эту строку, но все же может я не так понял, может можно каким-то образом обьявить класс-шаблон, чтобы при определении его чл.функций можно было опускать template<class T> ? |
|||
|
||||
| srd |
|
|||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 27 Всего: 49 |
Не выноси определение членов за пределы класса, тогда не надо будет часто писать template<class T>.
А как, например, без template указать имена параметров шаблона в определении члена шаблонного класса? -------------------- Не смей читать мою подпись!!! |
|||
|
||||
| En_t_end |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 1 Всего: 20 |
Ну разрешилы бы создатели делать следующее, использовать template подобно namespace, то есть применять определение шаблона локально для некого блока, допустим:
Добавлено @ 07:54
Тогда я нарушу главный принцип абстракции данных. И вобще мне бы хотелось реализацию отделять от интерфейса. СУВ Это сообщение отредактировал(а) En_t_end - 12.4.2005, 07:50 |
||||||
|
|||||||
| np9mi7 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
|
|||
|
||||
| Goryachev |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 67 Регистрация: 23.2.2005 Где: Израиль Репутация: нет Всего: нет |
Но все равно же потребитель получает опен сорс, и на реализацию, и на интерфейс, когда template class. Поэтому, не вижу никакого смысла отделять. |
|||
|
||||
| pablo |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 320 Регистрация: 12.2.2005 Где: Вильнюс, Литва Репутация: 4 Всего: 6 |
Существует способ отделения, но это добавляет лишний гемор, к программе.
The export keyword This keyword was proposed as a way of separating the interface of templates from their implementation. However it adds its own complexity to the linking process, which can detract from any advantages in practice. Exported templates Under the exported model, you define a template in a .cpp file, compile it separately, declare it in an .h file as export, and then #include only the .h file in other translation units. For example:
In reality, things aren't that simple. When a template is instantiated, dependent names (i.e., names that depend on the type of a template parameter such as t in the example above) are looked up in both the current context (i.e., where the instantiation occurs) and the context of the template's definition. The compiler cannot generate the code of a template instantiation--exported or not--without looking at its definition. As if This is a requirement in the C++ standard. The only way to satisfy this requirement in the case of an exported template is by an "as-if" rule: The compiler either inserts stubs into the object file, deferring code generation to a later stage, or it must somehow retrieve the template's definition by magic. In either case, the sources containing the exported template definitions must be made available at the time of instantiation. Вот ещё несколько страничек где можно об этом почитать. http://asia.cnet.com/builder/program/java/...39194066,00.htm http://www.eyt.ca/blog/item/89/ http://www.informit.com/guides/content.asp...2004-10-19&rl=1 -------------------- Первый блин всегда похож на сферу, иногда бывает и куб. |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 1 Всего: 20 |
Мда... с этим действительно гемора многа
ЕКЛМН... блин, меня сразу скрючело от этой мысли ЗЫ ладно уж придется на 10% больше строк писать |
|||
|
||||
| chipset |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
pablo, в VC7.1 эта штука не работает.
--------------------
|
|||
|
||||
| pablo |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 320 Регистрация: 12.2.2005 Где: Вильнюс, Литва Репутация: 4 Всего: 6 |
chipset Эта штука, работает только в некоторых компиляторах, например Intel C++, вот не помну в какой именно версии или 7.0 или 8.0, 8.1, и Comeau C/C++TM 4.3.3.
Если еще где, то скажите. -------------------- Первый блин всегда похож на сферу, иногда бывает и куб. |
|||
|
||||
| Fire-Plug |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 15.3.2005 Репутация: -1 Всего: 0 |
Для шаблонных классов этот принцип не катит по той причине, что параметры template разрешаются компилятором для конкретных типов путем генерации N экземпляров исх. кода (по одному экземпляру для каждой уникальной комбинации использованных типов). Объявление и реализация шаблонных классов поэтому размещается в одном файле, как правило - заголовочном. Иначе, где компайлеру искать файл с реализацией методов шаблонного класса? --------------------
Объясни другому - поймешь сам (Народная примета) |
|||
|
||||
| chipset |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
Насколько я помню стандарт - это включено в него. Поэтому ещё наверное в gcc будет работать.. Шаблоны и модули почитай.. --------------------
|
||||
|
|||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
В стандарт-то включено, но до сих пор, кроме Comeau (и возможно ICC, т.к. они на одном фронтэнде EDG) это нигде не реализовано. В т.ч. и в GCC: http://gcc.gnu.org/bugs.html#missing -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| Fantasist |
|
||||||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Читал я статью разработчиков по поводу реализации экспортных шаблонов. А... вот нашел. Называется "Why We Can’t Afford Export". Выдержка оттуда по поводу дороговизны реализации экспортных шаблонов:
И там где-то ихнея реккомендация разработчикам компиляторов по поводу реализации export templates:
Это сообщение отредактировал(а) Fantasist - 13.4.2005, 23:36 -------------------- Волны гасят ветер... |
||||||
|
|||||||
| chipset |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
Fantasist, интересно..
Хотя я думаю что лучше было бы следовать стандарту, гораздо лучше.. Моё скромное мнение, тссазать... --------------------
|
|||
|
||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Ошибки бывают и у разработчиков стандартов. На мой взгляд довольно очевидно, что это одна из таких промашек. Преимуществ ожидаемых exported templates не дает, а реализовать его очень дорого. В этом документе предлагается исключить exported templates из стандарта. -------------------- Волны гасят ветер... |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |