Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Class vs Typename


Автор: Mayk 27.5.2005, 18:05
чем
template <class _Tp> ....
отличается от
template <typename _Tp>
?

Автор: bel_nikita 27.5.2005, 18:56
Mayk
Цитата
чем
template <class _Tp> ....
отличается от
template <typename _Tp>
?
ничем smile

Автор: yaja 27.5.2005, 22:36
smile Мне препод по c++ рассказал о том, что Страуструп очень медленно печатает (уж не знаю откуда она это взяла smile ) и чтобы лишний раз не напрягаться, он ввел class smile smile smile

Автор: Alastis 28.5.2005, 08:33
yaja
вообще то вначале ввели class.
Mayk
Вот немножко из Липмана о class и typename:
Цитата
В списке параметров шаблона функции ключевые слова typename и class имеют одинаковый смысл и, следовательно, взаимозаменяемы. Любое из них может использоваться для объявления разных параметров-типов шаблона в одном и том же списке. Для обозначения параметра-типа более естественно, на первый взгляд, употреблять ключевое слово typename, а не class, ведь оно ясно указывает, что за ним следует имя типа. Однако это слово было добавлено в язык лишь недавно, как часть стандарта C++, поэтому в старых программах вы скорее всего встретите слово class. (Не говоря уже о том, что class короче, чем typename, а человек по природе своей ленив.)
Ключевое слово typename упрощает разбор определений шаблонов. (Мы лишь кратко остановимся на том, зачем оно понадобилось. Желающим узнать об этом подробнее рекомендуем обратиться к книге Страуструпа “Design and Evolution of C++”.) При таком разборе компилятор должен отличать выражения-типы от тех, которые таковыми не являются; выявить это не всегда возможно. Например, если компилятор встречает в определении шаблона выражение Parm::name и если Parm – это параметр- тип, представляющий класс, то следует ли считать, что name представляет член-тип класса Parm?
Код

template <class Parm, class U>
Parm minus( Parm* array, U value )
{
Parm::name * p; // это объявление указателя или умножение?
// На самом деле умножение
}
Компилятор не знает, является ли name типом, поскольку определение класса, представленного параметром Parm, недоступно до момента конкретизации шаблона. Чтобы такое определение шаблона можно было разобрать, пользователь должен подсказать компилятору, какие выражения включают типы. Для этого служит ключевое слово typename. Например, если мы хотим, чтобы выражение Parm::name в шаблоне функции minus() было именем типа и, следовательно, вся строка трактовалась как объявление указателя, то нужно  модифицировать текст следующим образом:
Код

template <class Parm, class U>
Parm minus( Parm* array, U value )
{
typename Parm::name * p; // теперь это объявление указателя
}
Ключевое слово typename используется также в списке параметров шаблона для указания того, что параметр является типом.



Автор: En_t_end 28.5.2005, 09:26
Цитата
Страуструп очень медленно печатает

smile блин, круто. Хороший препод раз шутить умеет.

Автор: Mayk 29.5.2005, 07:47
Хмм, зачем использовать 2 вещи? Чем class не устроил? В стандарте сказано, что "семантической разницы нет"(т.е. "смысл один"? А какая еще разница может быть, кроме "sementic"? Только в кол-ве букв?)
Вот такая вещь тоже работает.
Код

template <class Parm, class U>
Parm minus( Parm* array, U value )
{
class Parm::name * p; // теперь это объявление указателя
}

И где хоть какое-нибудь упрощение? Надо будет поискать "дизайн и эвиолюции".
Блин, надеюсь, что в своих упрощениях ИСОшники не дойдут в будущем до "template<class _Tp> is obsoloted now, use typename instead".


Автор: np9mi7 29.5.2005, 12:53
Страуструп об этом в своей книге пишет.... Ничем они не отличаются....

Автор: Void 29.5.2005, 20:14
Цитата(Mayk @ 29.5.2005, 09:47)
Блин, надеюсь, что в своих упрощениях ИСОшники не дойдут в будущем до "template<class _Tp> is obsoloted now, use typename instead".

Да ни в жисть smile Backward compatibility между следующей редакцией и C++03 обещают стопроцентную.
P.S. Когда в последний раз Комитет занимался упрощениями, что-то не припомню? smile

Непродолжительное гугление в c.l.c++(.m) показало, что многие используют такую практику: использовать class, когда параметр шаблона действительно должен являться классом, и typename, когда это простой (встроенный) тип. Я, кстати, тоже так обычно делаю.

Автор: Fantasist 1.6.2005, 06:20
Цитата(yaja @ 27.5.2005, 19:36)
Мне препод по c++ рассказал о том, что Страуструп очень медленно печатает



В оригинале Страуструп говорит, что так как в объявлении шаблона typename и class взаимозаменяемы, то он предпочитает использовать class, так как он занимает меньше места на экране, а этого места ему постоянно не хватает. smile

А зачем ввели typename... ну наверное, чтобы можно было более ясно выразиться. Слово class просто используется и в другом смысле и поэтому не столь явно указывает намерение.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)