2015-02-27 2 views
0

Предположим, у меня есть шаблон класса следующимразница между именем шаблона и имя шаблона класса

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

Мой вопрос, когда мы хотим, чтобы указатель класса Node, почему косяк мы используем Node* nxt и какова разница между Node*<T> nxt и Node* nxt?

ответ

1

В чем разница между Node*<T> nxt и Node* nxt?

Нет такого типа, как Node. Node<T> будет типом, а Node - это шаблон (не тип), из которого вы можете сделать больше типов. В результате у вас может быть указатель на Node<T>, но не на Node; следовательно, Node<T>* действительно и Node* нет.

Мой вопрос, когда мы хотим, чтобы указатель на класс Node

Вы не хотите указатель на шаблон класса Node, но в какой-то определенного типа, как Node<int>. Также обратите внимание, что Node<int> и Node<float> являются совершенно разными типами, похожими на то, как разные говорят Animal и Pencil.

почему косяк мы используем Node* nxt

Потому что вы не можете сделать указатель на не-типа сущности. Это шаблон, а не тип.

2

На самом деле, в определении шаблона класса должно быть указано Node* nxt, и оно будет иметь то же значение, что и Node<T>* nxt. В общем, внутри определения шаблона класса C с параметрами шаблона T1, T2, ... или такого, вы можете просто написать C, и это будет эквивалентно C<T1, T2, ...>. Попробуйте, он скомпилируется. (Чтобы быть более точными, то типа Node ведет себя так, как будто он объявлен как вложенный тип внутри класса.)

Вне определение класса (и определения функций члена), вы должны поставить параметры шаблона, а чем просто писать Node сам по себе, потому что имя Node обозначает шаблон, а не класс; шаблон класса не является типом, но класс, полученный путем создания экземпляра шаблона класса с параметрами шаблона, является типом.

+0

Активирован для 'Node *' внутри бит класса. Я предпочел объяснить это с помощью внешней части, чтобы дать понять, что OP - поразительная разница между ними - класс шаблона и тип. – legends2k

Смежные вопросы