为了向后兼容“C模板”,C ++中是否存在typename关键字?

时间:2010-02-25 19:53:37

标签: c++ c templates standards

我正在参加一个C ++课程,我的老师顺便提到C ++中存在typename关键字(而不是在模板声明中使用class关键字),以便向后兼容“C模板。”

这引起了我的注意。我从来没有看到或听说过C ++的模板之类的东西(除了,也许是预处理器......而且根本不是同一个东西)在ANSI C中。所以,我错过了什么巨大在某个地方,或者这是gcc或其他什么的真正深奥的延伸,还是我的老师偏离基地?

7 个答案:

答案 0 :(得分:27)

我认为你的老师不在基础。

请参阅Stan Lippman's post: Why C++ Supports both Class and Typename for Type Parameters了解C ++支持这两者的真正原因。

答案 1 :(得分:6)

也许你老师的目标是“......为了向后兼容C 类型 ”,即认识到{{{当template<class T>是C风格的内置类型(例如Tchar时,1}}会产生误导,正如其他人所说的那样。 但那不是一个班级!: - )

前来一些GCC人员suggesting使得C编译器可以使用模板机器将是实现C99的int的好方法,但这似乎没有达到任何东西。

答案 2 :(得分:5)

答案 3 :(得分:3)

你的老师正在努力。 C中没有模板这样的东西。typename关键字的存在有两个原因:

  1. template<typename T>template<class T>更有意义,因为T可以是intdouble等非类别类型。

  2. 它可用于解析A::B * foo;等声明中的解析歧义。这是声明一个名为foo的变量,还是一个乘法表达式? (答案:它被解析为后者。要使它成为声明写typename A::B *foo;,它告诉编译器将A::B解释为类型名称,而不是变量名称。)

  3. 有关详细说明,请参阅http://pages.cs.wisc.edu/~driscoll/typename.html

答案 4 :(得分:2)

不,没有C模板这样的东西。 typename甚至不是C中的关键字。

答案 5 :(得分:0)

这似乎不对。 typename在C中根本不是保留字。

也许他们错过了/记得并且正在考虑“C with Classes”。

答案 6 :(得分:0)

我想说C真的没有本机模板的东西,但是,你可以通过网络上的某种MetaProgrammingtake a look使它工作得很好为...

另一个重要的事情是C是一种通用的编程语言,因此可以通过更多努力完成很多事情,如面向对象,模板和其他一些事情。

像Gnome这样的项目证明它可以做得非常好。

P.S。:对不起我可怕的英语!!!