Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > В чем разница между typename и class?


Автор: andrew_121 13.6.2009, 14:04
Весь вопрос.

Автор: zim22 13.6.2009, 14:10
typename универсальней
весь ответ smile
***
иногда в шаблонах необходимо уточнить, является ли переменная типом или нет. это делается с помощью typename, но никак не через class
Код

template<class C>
void sort(C c) {
  typename C::iterator * it = c.begin();
}

Автор: andrew_121 13.6.2009, 14:13
zim22, Не понял... smile 

Автор: mes 13.6.2009, 14:14
В том, что typename "шире", чем class smile
В списке параметров нет семанической разницы между ними. Но typename имеет и другое назначение - для указания, что последующее имя является типом

Автор: zim22 13.6.2009, 14:15
andrew_121, хотите много умных слов, вы их получите smile
***
Иногда компилятору необходимо помогать в устранении неоднозначности синтаксического анализа.
SCollection имеет вложенное имя типа ElemT.
Однако фунция fill не сработает, т.к. вложенное имя Cont::ElemT не распознаётся как имя типа!
Код

template <typename Etype>
class SCollection {
public:
  typedef Etype ElemT;
  void insert(const Etype &) { }
};

в нижепреведенной функции необходимо typename добавить
Код

typename Cont::ElemT a[]


Код

template <class Cont>
void fill(Cont &c, Cont::ElemT a[], int len) { // ошибка!
  for (int i = 0; i < len; ++i)
    c.insert(a[i]);
}

Автор: andrew_121 13.6.2009, 14:16
zim22, Уже страшно)))

Автор: mes 13.6.2009, 14:19
Цитата

14.1/1
  There  is  no semantic difference between class and typename in a tem-
  plate-parameter.  typename followed by an unqualified-id names a  tem-
  plate  type  parameter.  typename followed by a qualified-name denotes
  the type in a non-type parameter-declaration.

Автор: andrew_121 13.6.2009, 14:21
Вот что об этом говорит стандарт:
Код

There is no semantic difference between class and typename in a template-parameter. typename followed by an
unqualified-id names a template type parameter. typename followed by a qualified-id denotes the type in a non-type
parameter-declaration. A storage class shall not be specified in a template-parameter declaration.

Автор: zim22 13.6.2009, 14:22
Цитата(andrew_121 @  13.6.2009,  14:21 Найти цитируемый пост)
Вот что об этом говорит стандарт

Цитата

There is no semantic difference between class and typename in a template-parameter

В стандарте также сказано, что
Цитата

В случаях неоднозначности интерпретации семантики шаблонного параметра вложенное имя не считать именем типа.


Цитата

14.6.2
2 A name used in a template declaration or definition and that is dependent on a template-parameter is assumed not to
name a type
 unless the applicable name lookup finds a type name or the name is qualified by the keyword typename.

Автор: andrew_121 13.6.2009, 14:22
mes, Почти одновременно. smile 

Автор: mes 13.6.2009, 14:24
Цитата(andrew_121 @  13.6.2009,  13:22 Найти цитируемый пост)
Почти одновременно

Если знаете где искать, зачем форумчан то спрашивали ?!  smile 

Автор: andrew_121 13.6.2009, 14:25
Цитата(zim22 @ 13.6.2009,  14:15)
andrew_121, хотите много умных слов, вы их получите smile
***
Иногда компилятору необходимо помогать в устранении неоднозначности синтаксического анализа.
SCollection имеет вложенное имя типа ElemT.
Однако фунция fill не сработает, т.к. вложенное имя Cont::ElemT не распознаётся как имя типа!
Код

template <typename Etype>
class SCollection {
public:
  typedef Etype ElemT;
  void insert(const Etype &) { }
};

в нижепреведенной функции необходимо typename добавить
Код

typename Cont::ElemT a[]


Код

template <class Cont>
void fill(Cont &c, Cont::ElemT a[], int len) { // ошибка!
  for (int i = 0; i < len; ++i)
    c.insert(a[i]);
}

Вот теперь понял.
Спасибо!

Добавлено через 1 минуту и 22 секунды
Цитата(mes @  13.6.2009,  14:24 Найти цитируемый пост)
Если знаете где искать, зачем форумчан то спрашивали ?!

Я сначала спросил. Потом подумал глянуть что об этом говорит стандарт.
Без какого либо подвоха smile 

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