模板名称和类模板名称之间的差异

时间:2015-02-27 07:01:24

标签: c++ templates

假设我有一个类模板如下

template <class t>
class Node{
    T data;
    Node<T>* nxt;
}

我的问题是,当我们想要一个指向课程Node的指针时,为什么我们不能使用Node* nxtNode*<T> nxtNode* nxt之间有什么区别?

2 个答案:

答案 0 :(得分:2)

实际上,在类模板定义中编写Node* nxt是有效的,它与Node<T>* nxt具有相同的含义。通常,在包含模板参数CT1,...等的类模板T2的定义中,您只需编写C即可。到C<T1, T2, ...>。试试吧,它会编译。 (更准确地说,类型Node的行为就像在类中声明为嵌套类型一样。)

外部类定义(以及任何成员函数定义),您必须提供模板参数,而不是仅仅自己编写Node,因为名称Node表示一个模板,而不是一个类;类模板不是类型,但通过使用模板参数实例化类模板获得的类是一种类型。

答案 1 :(得分:1)

  

Node*<T> nxtNode* nxt之间有什么区别?

没有这种称为Node的类型。 Node<T>将是一种类型,而Node是一个模板(不是类型),您可以从中创建更多类型。因此,你可以指向Node<T>而不是Node的指针;因此Node<T>*有效且Node*无效。

  

我的问题是我们想要一个指向类Node

的指针

您不希望指向模板类Node的指针,而是某些特定类型的指针,例如Node<int>。另请注意,Node<int>Node<float>是完全不同的类型,类似于AnimalPencil类型的不同。

  

为什么我们不能使用Node* nxt

因为您无法指向非类型实体。它是一个模板,而不是一个类型。