Существует ли ключевое слово typename в C ++ для обратной совместимости с «шаблонами C»? - PullRequest
19 голосов
/ 25 февраля 2010

Я беру класс C ++, и мой учитель попутно упомянул, что ключевое слово typename существует в C ++ (в отличие от использования ключевого слова class в объявлении шаблона) для обратной совместимости с «шаблонами C. «

Это взорвало мой разум. Я никогда не видел и не слышал ничего похожего на шаблоны C ++ (за исключением, возможно, препроцессора ... и это совсем не одно и то же) в ANSI C. Итак, я что-то пропустил Огромное где-то, или это действительно эзотерическое расширение на gcc или что-то в этом роде, или мой учитель далеко не так?

Ответы [ 7 ]

27 голосов
/ 25 февраля 2010

Я думаю, что ваш учитель не в базе.

См. Пост Стэна Липпмана: почему C ++ поддерживает и класс, и имя типа для параметров типа по реальной причине, почему C ++ поддерживает оба.

6 голосов
/ 26 февраля 2010

Возможно, фраза, к которой стремился ваш учитель, была следующей: «... для обратной совместимости с типами C », т. Е. С пониманием проблемы, с которой сталкивается template<class T> вводит в заблуждение, когда T является встроенным типом в стиле C, например char или int, как уже говорили другие. Но это не класс! : -)

Некоторое время назад несколько людей из GCC предложили , чтобы сделать механизм шаблонов доступным для компилятора C, было бы хорошим способом реализации <tgmath.h> в C99, но, похоже, этого не произошло. что-нибудь.

5 голосов
/ 25 февраля 2010
3 голосов
/ 25 февраля 2010

Ваш учитель придумывает вещи. В C. нет такого понятия, как шаблоны. Ключевое слово typename существует по двум причинам:

  1. Имеет смысл сказать template<typename T>, чем template<class T>, поскольку T может относиться к неклассовым типам, таким как int или double.

  2. Он может использоваться для устранения неоднозначностей в таких объявлениях, как A::B * foo;. Объявляет ли это переменную с именем foo, или это выражение умножения? (Ответ: он анализируется как последний. Чтобы сделать его декларацией, напишите typename A::B *foo;, который говорит компилятору интерпретировать A::B как имя типа, а не имя переменной.)

См. http://pages.cs.wisc.edu/~driscoll/typename.html для подробного объяснения.

2 голосов
/ 25 февраля 2010

Нет, такого понятия, как шаблон Си, не существует. typename даже не является ключевым словом в C.

0 голосов
/ 19 июля 2013

Я хочу сказать, что C действительно не имеет встроенных шаблонов, однако, вы можете сделать так, чтобы он работал нормально с каким-то MetaProgramming , , посмотрите вокруг в интернете вы найдете как ...

Еще одна важная вещь, которую нужно сказать, это то, что C - это язык программирования общего назначения, поэтому многие вещи, такие как объектная ориентация, шаблоны и некоторые другие вещи, могут быть выполнены с небольшим количеством усилий.

Такие проекты, как Gnome, являются доказательством того, что это можно сделать, и очень хорошо.

П.С .: Извините за мой ужасный английский !!!

0 голосов
/ 25 февраля 2010

Это не кажется правильным. typename вообще не является зарезервированным словом в C.

Возможно, они ошиблись / вспомнили и думали о "C с классами".

...