Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> template, разьясните плиз :) 
:(
    Опции темы
En_t_end
Дата 12.4.2005, 07:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 1
Всего: 20



Код

#include "stdafx.h"
#define T_cl template<class T>
using namespace std;
T_cl
class Tren{
public:
    Tren(T var);
    T get_val();
    void put_val(T var);
private:
    T variable;
};
T_cl
T Tren<T>::get_val(){
    return variable;
}
T_cl
void Tren<T>::put_val(T var){
    variable = var;
}
T_cl
Tren<T>::Tren(T var): variable(var){}
void main(){
    Tren<int> qw(100);
    qw.put_val(500);
    cout << qw.get_val() << endl;
}


Вот вопрос, почему перед каждым определением члена-функции класса-шаблона надо употреблять оператор template<class T> ? Ведь это неудобно, крайне.
Я уже задефайнел эту строку, но все же может я не так понял, может можно каким-то образом обьявить класс-шаблон, чтобы при определении его чл.функций можно было опускать template<class T> ?
PM MAIL ICQ Skype GTalk Jabber   Вверх
srd
Дата 12.4.2005, 07:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



Не выноси определение членов за пределы класса, тогда не надо будет часто писать template<class T>.
Цитата(En_t_end @ 12.4.2005, 14:17)
Вот вопрос, почему перед каждым определением члена-функции класса-шаблона надо употреблять оператор template<class T> ?

А как, например, без template указать имена параметров шаблона в определении члена шаблонного класса?



--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
En_t_end
Дата 12.4.2005, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 1
Всего: 20



Цитата
А как, например, без template указать имена параметров шаблона в определении члена шаблонного класса?

Ну разрешилы бы создатели делать следующее, использовать template подобно namespace, то есть применять определение шаблона локально для некого блока, допустим:
Код

using namespace std;
{
template<class T>
class Tren{
public:
    Tren(T var);
    T get_val();
    void put_val(T var);
private:
    T variable;
};
T Tren<T>::get_val(){
    return variable;
}
void Tren<T>::put_val(T var){
    variable = var;
}
Tren<T>::Tren(T var): variable(var){}
}

Добавлено @ 07:54
Цитата
Не выноси определение членов за пределы класса, тогда не надо будет часто писать template<class T>.

Тогда я нарушу главный принцип абстракции данных.
И вобще мне бы хотелось реализацию отделять от интерфейса. СУВ

Это сообщение отредактировал(а) En_t_end - 12.4.2005, 07:50
PM MAIL ICQ Skype GTalk Jabber   Вверх
np9mi7
Дата 12.4.2005, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

Репутация: 5
Всего: 10



Цитата
Вот вопрос, почему перед каждым определением члена-функции класса-шаблона надо употреблять оператор template<class T> ? Ведь это неудобно, крайне.
, удобно не удобно, но с твоими #define нами текст ваще не читается... так что, я хочу сказать что , что это вода в ступе... smile ну попрограммируй на delphi, там ваще нет template....


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
Goryachev
Дата 12.4.2005, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 23.2.2005
Где: Израиль

Репутация: нет
Всего: нет



Цитата(En_t_end @ 12.4.2005, 07:45)
Тогда я нарушу главный принцип абстракции данных.
И вобще мне бы хотелось реализацию отделять от интерфейса. СУВ

Но все равно же потребитель получает опен сорс, и на реализацию, и на интерфейс, когда template class. Поэтому, не вижу никакого смысла отделять.
PM MAIL   Вверх
pablo
Дата 12.4.2005, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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:

Код

//func.h 
export template void f(T t); // declaration 
//func.cpp 
template void f(T t) {//definition 
//.. 
} 
//main.cpp 
#include "f.h" 
int main() 
{ 
f(7); //instantiate void func(7) 
} 



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


--------------------
Первый блин всегда похож на сферу, иногда бывает и куб.
PM MAIL ICQ   Вверх
En_t_end
Дата 12.4.2005, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 1
Всего: 20



Мда... с этим действительно гемора многа smile
Цитата
ну попрограммируй на delphi, там ваще нет template....

ЕКЛМН... блин, меня сразу скрючело от этой мысли smile
ЗЫ ладно уж придется на 10% больше строк писать smile
PM MAIL ICQ Skype GTalk Jabber   Вверх
chipset
Дата 12.4.2005, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



pablo, в VC7.1 эта штука не работает.


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
pablo
Дата 12.4.2005, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 12.2.2005
Где: Вильнюс, Литва

Репутация: 4
Всего: 6



chipset Эта штука, работает только в некоторых компиляторах, например Intel C++, вот не помну в какой именно версии или 7.0 или 8.0, 8.1, и Comeau C/C++TM 4.3.3.
Если еще где, то скажите.



--------------------
Первый блин всегда похож на сферу, иногда бывает и куб.
PM MAIL ICQ   Вверх
Fire-Plug
Дата 13.4.2005, 02:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 15.3.2005

Репутация: -1
Всего: 0



Цитата(En_t_end @ 12.4.2005, 07:45)
И вобще мне бы хотелось реализацию отделять от интерфейса

Для шаблонных классов этот принцип не катит по той причине, что параметры template разрешаются компилятором для конкретных типов путем генерации N экземпляров исх. кода (по одному экземпляру для каждой уникальной комбинации использованных типов).
Объявление и реализация шаблонных классов поэтому размещается в одном файле, как правило - заголовочном. Иначе, где компайлеру искать файл с реализацией методов шаблонного класса?

--------------------
Объясни другому - поймешь сам (Народная примета)
PM MAIL   Вверх
chipset
Дата 13.4.2005, 02:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



Цитата(pablo @ 12.4.2005, 05:00)
chipset Эта штука, работает только в некоторых компиляторах, например Intel C++, вот не помну в какой именно версии или 7.0 или 8.0, 8.1, и Comeau C/C++TM 4.3.3.

Насколько я помню стандарт - это включено в него.
Поэтому ещё наверное в gcc будет работать..
Шаблоны и модули почитай..


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Void
Дата 13.4.2005, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(chipset @ 13.4.2005, 04:44)
Насколько я помню стандарт - это включено в него.
Поэтому ещё наверное в gcc будет работать..

В стандарт-то включено, но до сих пор, кроме 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
PM MAIL WWW GTalk   Вверх
Fantasist
Дата 13.4.2005, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Цитата(chipset @ 12.4.2005, 23:44)
Насколько я помню стандарт - это включено в него.
Поэтому ещё наверное в gcc будет работать..


Читал я статью разработчиков по поводу реализации экспортных шаблонов.

А... вот нашел. Называется "Why We Can’t Afford Export".

Выдержка оттуда по поводу дороговизны реализации экспортных шаблонов:

Цитата

EDG, who are widely acknowledged to be among (or “the”) world’s best C++ compiler writers, report the following data from the world’s only existing implementation of export. Steve Adamczyk notes: “We don’t believe the effort is unique to our implementation; other implementers will have to do similar things.”

• EDG’s effort:

    • Design: 1.5 years (elapsed) to come up with a design they believed they could implement.

    • Development: 3 person-years (3 people × >1 year each)
        (Note: By comparison, implementing the complete Java language from scratch took the
        same team 2 person-years.)

  • Plus QA/testing primarily for the front end, plus their licensees’ QA/testing for complete    implementations.

EDG estimates elapsed time for other implementers approx. 2½-3 years, start to finish.


И там где-то ихнея реккомендация разработчикам компиляторов по поводу реализации export templates:

Цитата
Don't do it.


Это сообщение отредактировал(а) Fantasist - 13.4.2005, 23:36


--------------------
Волны гасят ветер...
PM MAIL   Вверх
chipset
Дата 14.4.2005, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



Fantasist, интересно..
Хотя я думаю что лучше было бы следовать стандарту, гораздо лучше.. Моё скромное мнение, тссазать...


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Fantasist
Дата 15.4.2005, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Цитата(chipset @ 13.4.2005, 21:19)
Хотя я думаю что лучше было бы следовать стандарту, гораздо лучше.


Ошибки бывают и у разработчиков стандартов. На мой взгляд довольно очевидно, что это одна из таких промашек. Преимуществ ожидаемых exported templates не дает, а реализовать его очень дорого. В этом документе предлагается исключить exported templates из стандарта.





--------------------
Волны гасят ветер...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0891 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.