相关疑难解决方法(0)

我必须在何处以及为何要使用"模板"和"typename"关键字?

在模板,在那里,为什么我必须把typenametemplate上依赖的名字呢?究竟什么是依赖名称?我有以下代码:

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)

c++ templates c++-faq dependent-name typename

1061
推荐指数
8
解决办法
15万
查看次数

将typename关键字与typedef和new一起使用

考虑一下这段代码

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)

在这两种情况下,关键字typedefnew使其足够清楚,无论遵循编译器类型,不是 .

所以我的问题是,为什么编译器仍然需要typename关键字,即使在明确的情况下,例如我们使用typedefnew


编辑(阅读Johannes Schaub的回复后):

//typedef NOT followed by a type!
int typedef A;
Run Code Online (Sandbox Code Playgroud)

这种语法要求我稍微修改一下我的问题,以便我试图做出的观点可能会被其他人看到.

想想这个, …

c++ templates typedef typename language-lawyer

20
推荐指数
2
解决办法
1万
查看次数