使用不带参数的模板名称

时间:2014-10-04 17:27:32

标签: c++

我有这段代码:

template <typename A>
class templatedclass {
    public:
    using type = templatedclass;
};

template <typename A>
class sinkstuff {
    public:
    void print() {
        cout << "generic sinkstuff";
    }
};
template <typename A>
class sinkstuff <templatedclass<A>> {
    public:
    void print() {
        cout << "partiallyspecialized sinkstuff";
    }
};

template <typename NtoA>
struct pass_parameter : sinkstuff<typename templatedclass<NtoA>::type> {}; 


int main() {
  pass_parameter<int> obj;
  obj.print();
  cout << is_same<templatedclass<int>, typename templatedclass<int>::type>::value; // 1, yes
}

我一直认为&#34;使用指令&#34;是类固醇的类型。为什么我可以使用&#34; templatedclass<int>::type&#34;没有再次指定参数,即&#34; templatedclass<int>::type<int>&#34; ?

Isn&#39;#34;使用type = templatedclass&#34;只是一个文字替代?我错过了什么吗?

2 个答案:

答案 0 :(得分:4)

一个班级的名字是&#34;注入&#34;在这个类中,这被称为 inject-class-name 。它类似于:

class my_class_name
{
public:
    typedef ::my_class_name my_class_name;
};

(但这当然没有编译,一个类可能没有与该类同名的手动声明的成员。)

类模板也有一个注入类名,它可用于引用类模板本身或当前特化(包括当前模板参数),具体取决于上下文:

[temp.local] / 1

  

与普通(非模板)类一样,类模板具有注入类名称。 inject-class-name可以用作模板名称类型名称。当它与 template-argument-list 一起使用时,作为模板 template-parameter template-argument ,或作为最终标识符在友元类模板声明的 elaborated-type-specifier 中,它引用了类模板本身。 否则,它是等效的   到 template-name ,后跟<> 中包含的类模板的 template-parameters

答案 1 :(得分:2)

这与using指令没有任何关系。在A<T>的定义中(using指令在该范围内),说A与说A<T>相同。

这与你写的原因相同:

template <typename T>
struct A
{
   void foo(const A&);
};

而不是

template <typename T>
struct A
{
   void foo(const A<T>&);
};

有关详情,请搜索&#34; 注入课程名称&#34;。