I†™m взятие класса C++ и моего учителя упомянул мимоходом что typename
ключевое слово существовало в C++ (в противоположность использованию class
ключевое слово в объявлении шаблона), для назад совместимости с †templates.†œC?
Это унесло мой ум. I†™ve никогда не замечаемый или слышал, говорят о чем-либо как C ++Г€ ™s шаблоны (кроме, возможно, preprocessorâ€\¦ и that†™s не действительно то же самое вообще) в ANSI C. Так, сделал я пропускаю что-то огромное где-нибудь, или это действительно тайное расширение gcc
или что-то или действительно ли мой учитель путь является неосновным?
Я думаю, ваш учитель не в основе.
См. сообщение Стэна Липпмана: Почему C ++ поддерживает и класс, и имя типа для параметров типа , чтобы узнать истинную причину, по которой C ++ поддерживает и то, и другое.
Возможно, фраза, к которой стремился ваш учитель, была примерно такой: «... для обратной совместимости с типами C », т. Е. , осознавая проблему, заключающуюся в том, что template
вводит в заблуждение, когда T
является встроенным типом в стиле C, например char
или int
, как говорили другие. Но это же не класс! : -)
Некоторое время назад несколько специалистов из GCC предлагали , что создание механизма шаблонов, доступного для компилятора C, было бы хорошим способом реализации
, но, похоже, это ни к чему не привело.
Нет, не существует такой вещи, как шаблон в Си. typename
даже не является ключевым словом в Си.
Это кажется неправильным. typename вообще не является зарезервированным словом в C.
Возможно, они неправильно выразились/запомнили и думали о "C с классами".
Ваш учитель придумывает. В C. нет такой вещи, как шаблоны. Ключевое слово typename
существует по двум причинам:
Более разумно сказать template
, чем template
, поскольку T
может быть неклассовыми типами, такими как int
или double
.
Его можно использовать для устранения неоднозначности синтаксического анализа в объявлениях типа A :: B * foo;
. Объявляется ли при этом переменная с именем foo
или это выражение умножения? (Ответ: он анализируется как последний. Чтобы сделать его объявлением, напишите typename A :: B * foo;
, которое сообщает компилятору интерпретировать A :: B
как имя типа, не имя переменной.)
См. http://pages.cs.wisc.edu/~driscoll/typename.html для подробного объяснения.