Учитывая, что шаблон класса называется Queue
с вложенным классом Node
(не шаблон класса):
template<typename T>
class Queue {
private:
struct Node {
Node (T value) : value(value), next(nullptr) {}
Node (T value, Node* next) : value(value), next(next) {}
T value;
Node* next;
};
Node* head;
size_t sz;
void cleanList();
public:
Queue();
Queue(const Queue& st);
Queue& operator=(const Queue& st);
~Queue();
size_t size() const noexcept;
bool isEmpty() const noexcept;
T& front();
const Tt& front() const;
void enqueue(const T& elem);
void dequeue();
};
Я могу сделать это:
template<typename T>
void Queue<T>::enqueue(const T& elem) {
Node* temp = new Node(elem);
}
Это компилируется, но почему объявление Node
не требует дополнительной информации? (как Queue::Node
)
После прочтения Шаблоны и вложенные классы / структуры все 3 из них также работают и компилируются:
template<typename T>
void Queue<T>::enqueue(const T& elem) {
typename LLQueue<Object>::Node* temp1 = new Node(elem);
LLQueue<Object>::Node* temp2;
LLQueue::Node* temp3;
}
Почему все версии работают? Что предпочтительнее при использовании вложенного класса в шаблоне класса?