Ответ 1
Я думаю, что ваш учитель не работает.
См. Сообщение Stan Lippman: Почему С++ поддерживает как Class, так и Typename для параметров типа по реальной причине, почему С++ поддерживает оба.
Im принимает класс С++, и мой учитель попутно отметил, что ключевое слово typename
существует в С++ (в отличие от использования ключевого слова class
в объявлении шаблона), для обратной совместимости с "шаблонами C".
Это взорвало мой разум. Я никогда не видел и не слышал о чем-то вроде шаблонов С++ (за исключением, может быть, препроцессора... и это совсем не то же самое) в ANSI C. Итак, я пропустил что-то огромное где-то, или это действительно эзотерическое расширение на gcc
или что-то в этом роде, или мой учитель вне базы?
Я думаю, что ваш учитель не работает.
См. Сообщение Stan Lippman: Почему С++ поддерживает как Class, так и Typename для параметров типа по реальной причине, почему С++ поддерживает оба.
Нет, ANSI C не поддерживает шаблоны.
Возможно, фраза, к которой стремился ваш учитель, соответствовала "... для обратной совместимости с C типами", т.е. распознаванием проблемы, которая template<class T>
вводит в заблуждение, когда T
является встроенным типом C-стиля, таким как char
или int
, как говорили другие. Но это не класс!: -)
В то время как несколько людей из GCC были предлагая, что создание механизма шаблонов для компилятора C было бы хорошим способом реализации C99 <tgmath.h>
, но это, похоже, ни к чему.
Ваш учитель все обдумывает. Там нет такой вещи, как шаблоны в C. Ключевое слово typename
существует по двум причинам:
Имеет смысл сказать template<typename T>
, чем template<class T>
, поскольку T
может быть неклассовыми типами, такими как int
или double
.
Его можно использовать для разрешения разбора неоднозначностей в объявлениях типа A::B * foo;
. Означает ли это переменную с именем foo
, или это выражение умножения? (Ответ: он анализируется как последний. Чтобы сделать это декларацией, напишите typename A::B *foo;
, в котором компилятор должен интерпретировать A::B
как имя типа, а не имя переменной.)
Подробнее см. http://pages.cs.wisc.edu/~driscoll/typename.html.
Нет, нет такой вещи, как шаблон C. typename
не является ключевым словом в C.
Это не кажется правильным. typename не является зарезервированным словом вообще в C.
Возможно, они оговорились/вспомнили и думали о "C с классами".
Я хочу сказать, что у C действительно нет родного материала шаблона, однако вы можете заставить его работать нормально с каким-то MetaProgramming, посмотрите в Интернете, вы найдете, как...
Еще одна важная вещь заключается в том, что C является языком программирования для общего назначения, поэтому многое другое, например Object Orientation, template и некоторые другие вещи, можно сделать с меньшими усилиями.
Проекты, подобные Gnome, являются доказательством того, что это можно сделать и очень хорошо.
P.S.: Извините за мой страшный английский!!!