【问题标题】:using class name in a class template without template parameters在没有模板参数的类模板中使用类名
【发布时间】:2018-11-05 08:15:24
【问题描述】:

代码来自C++书籍,如下:

为什么这个公共成员 Link* next 没有 typename 参数?

template <typename E> class Link {
private:
    static Link<E>* freelist;
public:
    E element;
    Link* next;  // this line confused me....

    Link(const E& elemval, Link* nextval = NULL)
    {
        element = elemval; next = nextval;
    }
    Link(Link* nextval = NULL) { next = nextval; }
    void* operator new(size t){
        if (freelist == NULL) return ::new Link;
        Link<E>* temp = freelist;
        freelist = freelist->next;
        return temp; // Return the link
    }
};

我觉得应该是Link&lt;E&gt;* next

请告诉我它没有模板参数的原因。

【问题讨论】:

    标签: c++ templates


    【解决方案1】:

    这被称为“注入的类名”。该规则具体来自[temp.local]:

    与普通(非模板)类一样,类模板有一个injected-class-name(第 9 条)。 injected-class- name 可以用作 template-nametype-name。当它与 template-argument-list 一起使用时, 作为模板 template-parametertemplate-argument,或作为 elaborated-type-specifier 中的最终标识符 在友元类模板声明中,它指的是类模板本身。否则,等价 到 template-name 后跟 &lt;&gt; 中包含的类模板的模板参数。

    在类模板特化或部分特化的范围内,当 injected-class-name 是 用作type-name,相当于template-name后跟类的template-arguments 中包含的模板特化或部分特化。 [示例:

    template<template<class> class T> class A { };
    template<class T> class Y;
    template<> class Y<int> {
        Y* p;                                // meaning Y<int>
        Y<char>* q;                          // meaning Y<char>
        A<Y>* a;                             // meaning A<::Y>
        class B {
            template<class> friend class Y;  // meaning ::Y
        };
    };
    

    ——结束示例]

    这基本上是为了方便,所以类中的类名是指类本身,而不是任何可能具有相同名称的外部。对于类模板,如果模板参数列表很长,它可能会节省大量输入。

    【讨论】:

    • 所以相当于 Link* next 和 Link* next?
    • @Makoto 在template &lt;typename E&gt; class Link { ... }; 内,是的。
    猜你喜欢
    • 1970-01-01
    • 2022-01-09
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    相关资源
    最近更新 更多