可能重复:
Use of typename keyword with template function parameters
Use of typename keyword with typedef and new
我理解为什么C ++有typename
个关键字。解析某些令牌序列,例如
qwert * yuiop;
asdfg(*hjkl)(zxcvb);
取决于某些标识符(在本例中为qwert
,asdfg
和zxcvb
)是指类型还是值。因此,在模板中,有时需要告诉它,以便它可以解析模板定义。
template<class Qwert> void yuiop() {
typename Qwert::asdfg * zxcvb; // declare a pointer of type Qwert::asdfg
Qwert::asdfg * hjkl; // multiply Qwert::asdfg by hjkl
}
但是,在某些情况下,语法只能接受类型,但仍需要typename。
template<class Qwert> void yuiop(Qwert::asdfg) {
Qwert::asdfg hjkl;
}
这不编译。似乎典型的编译器假设Qwert :: asdfg是变量或常量,因此抛出语法错误。但为什么呢?
我的问题的实质是:为什么C ++标准不允许在这样的情况下从解析上下文中解析类型/值歧义?
(注:the nearest thing I've found online to a standard在第301页底部附近说明了这一点。我不知道在这方面是否有任何实际标准不同。)