我正在参加一个C ++课程,我的老师顺便提到C ++中存在typename
关键字(而不是在模板声明中使用class
关键字),以便向后兼容“C模板。”
这引起了我的注意。我从来没有看到或听说过C ++的模板之类的东西(除了,也许是预处理器......而且根本不是同一个东西)在ANSI C中。所以,我错过了什么巨大在某个地方,或者这是gcc
或其他什么的真正深奥的延伸,还是我的老师偏离基地?
答案 0 :(得分:27)
我认为你的老师不在基础。
请参阅Stan Lippman's post: Why C++ Supports both Class and Typename for Type Parameters了解C ++支持这两者的真正原因。
答案 1 :(得分:6)
也许你老师的目标是“......为了向后兼容C 类型 ”,即认识到{{{当template<class T>
是C风格的内置类型(例如T
或char
时,1}}会产生误导,正如其他人所说的那样。 但那不是一个班级!: - )
前来一些GCC人员suggesting使得C编译器可以使用模板机器将是实现C99的int
的好方法,但这似乎没有达到任何东西。
答案 2 :(得分:5)
不,ANSI C不支持模板。
答案 3 :(得分:3)
你的老师正在努力。 C中没有模板这样的东西。typename
关键字的存在有两个原因:
说template<typename T>
比template<class T>
更有意义,因为T
可以是int
或double
等非类别类型。
它可用于解析A::B * foo;
等声明中的解析歧义。这是声明一个名为foo
的变量,还是一个乘法表达式? (答案:它被解析为后者。要使它成为声明写typename A::B *foo;
,它告诉编译器将A::B
解释为类型名称,而不是变量名称。)
答案 4 :(得分:2)
不,没有C模板这样的东西。 typename
甚至不是C中的关键字。
答案 5 :(得分:0)
这似乎不对。 typename在C中根本不是保留字。
也许他们错过了/记得并且正在考虑“C with Classes”。
答案 6 :(得分:0)
我想说C真的没有本机模板的东西,但是,你可以通过网络上的某种MetaProgramming,take a look使它工作得很好为...
另一个重要的事情是C是一种通用的编程语言,因此可以通过更多努力完成很多事情,如面向对象,模板和其他一些事情。
像Gnome这样的项目证明它可以做得非常好。
P.S。:对不起我可怕的英语!!!