在模板,在那里,为什么我必须把typename和template上依赖的名字呢?究竟什么是依赖名称?我有以下代码:
template <typename T, typename Tail> // Tail will be a UnionNode too.
struct UnionNode : public Tail {
// ...
template<typename U> struct inUnion {
// Q: where to add typename/template here?
typedef Tail::inUnion<U> dummy;
};
template< > struct inUnion<T> {
};
};
template <typename T> // For the last node Tn.
struct UnionNode<T, void> {
// ...
template<typename U> struct inUnion {
char fail[ -2 + (sizeof(U)%2) ]; // Cannot be instantiated for any …Run Code Online (Sandbox Code Playgroud) 考虑一下这段代码
template<class T>
struct Sample
{
typename T::X *x; //declare pointer to T's X
};
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,typename编译器需要关键字,以便它可以消除模板中嵌套类型和嵌套值之间的歧义.这意味着,在没有typename关键字的情况下,编译器会将此解释为T :: X与x的乘法,
T::X *x; //multiply T::X with x
Run Code Online (Sandbox Code Playgroud)
因此,在可能出现歧义的情况下,关键字typename变得必要,以便消除歧义.但是,上下文本身消除歧义的情况很少.在其它主题讨论基类和函数参数的上下文(后者不虽然除去模糊).在这个主题中,我特别想讨论其他两个似乎毫不含糊的背景,但我们仍然需要写typename,
typedef typename T::X xtype;
pX = new typename T::X;
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,关键字typedef和new使其足够清楚,无论遵循编译器类型,不是 值.
所以我的问题是,为什么编译器仍然需要typename关键字,即使在明确的情况下,例如我们使用typedef和new?
//typedef NOT followed by a type!
int typedef A;
Run Code Online (Sandbox Code Playgroud)
这种语法要求我稍微修改一下我的问题,以便我试图做出的观点可能会被其他人看到.
想想这个, …