考虑这段代码,
template<class T>
struct Sample
{
typename T::X *x; //declare pointer to T's X
};
在上面的代码中,typename
编译器需要关键字,以便它可以在模板中消除嵌套类型和嵌套值之间的歧义。这意味着,在没有typename
关键字的情况下,编译器会将其解释为 T::X 与 x 的乘积,
T::X *x; //multiply T::X with x
因此,在可能出现歧义的情况下,关键字typename
成为必要,以消除歧义。但是,上下文本身消除歧义的情况很少。另一个主题讨论了基类和函数参数的上下文(尽管后者并没有消除歧义)。在这个话题中,我特别想讨论其他两个似乎没有歧义的上下文,但我们仍然需要写typename
,
typedef typename T::X xtype;
pX = new typename T::X;
在这两种情况下,关键字typedef
和new
让编译器清楚地知道后面的内容是type,而不是 value。
所以我的问题是,为什么编译器仍然需要typename
关键字,即使在明确的情况下,例如我们使用typedef
and时new
?
编辑(在阅读了Johannes Schaub的回复后):
//typedef NOT followed by a type!
int typedef A;
这种语法要求我稍微修改一下我的问题,以便其他人可以看到我试图提出的观点。
考虑到这一点,
T::X typedef *x;
因此,从上下文来看,编译器仍然很清楚 T::X 是一种类型,无论它出现在 之前 typedef
还是之后 typedef
。除非 C++ 允许我们写typedef 5 five
or typedef T::value t_value
(其中 T::value 是value),否则typedef
它本身的存在消除了所有歧义,因此,typename
标准似乎是不必要的要求(在这种情况下)。同样的论点也适用new
。
另外,我编写了一个使用这个结构作为模板参数的类模板:
struct A
{
struct X { string name; };
static const int X = 100;
};
我特别想知道以下代码(来自构造函数)是否正确(可移植),
//two interesting statements
pX = new typename T::X; //T::X means struct X
product = T::X * p; //but here, T::X means int X
完整的代码在ideone。回复前请看一下。:-)