请告诉我为什么我不能用模板实现接口?
队列.h
#ifndef UNTITLED104_QUEUE_H
#define UNTITLED104_QUEUE_H
#include <vector>
#include <cstdio>
using namespace std;
template <typename T>
class Node{
private:
T value;
public:
Node *next_node, *back_node;
Node():next_node(NULL),back_node(NULL){};
Node(T new_value):value(new_value),next_node(NULL),back_node(NULL){};
T getValue();
void setValue(T new_value);
void deleteNode();
Node* getNext();
Node* getBack();
};
template <typename T>
class Queue{
private:
Node<T>* firstNode=NULL;
unsigned size=0;
public:
Queue(T value);
Node<T>* getFirst();
Node<T>* getNode(int position);
unsigned int getSize();
Node<T>* insert_after(int position, T value);
};
#endif //UNTITLED104_QUEUE_H
队列.cpp
#include "Queue.h"
template<typename T>
T Node<T>::getValue() {
return nullptr;
}
template<typename T>
void Node<T>::setValue(T new_value) {
}
template<typename T>
void Node<T>::deleteNode() {
}
template<typename T>
Node *Node<T>::getNext() {
return nullptr;
}
template<typename T>
Node *Node<T>::getBack() {
return nullptr;
}
template<typename T>
Queue<T>::Queue(T value) {
}
template<typename T>
Node<T> *Queue<T>::getFirst() {
return nullptr;
}
template<typename T>
Node<T> *Queue<T>::getNode(int position) {
return nullptr;
}
template<typename T>
unsigned int Queue<T>::getSize() {
return 0;
}
template<typename T>
Node<T> *Queue<T>::insert_after(int position, T value) {
return nullptr;
}
错误:
C:\Users\Alex\CLionProjects\untitled104\Queue.cpp:21:1: error: invalid use of template-name 'Node' without an argument list
Node *Node<T>::getNext() {
^
C:\Users\Alex\CLionProjects\untitled104\Queue.cpp:26:1: error: invalid use of template-name 'Node' without an argument list
Node *Node<T>::getBack() {
^
它只是类范围内的
Node
同义词。Node<T>
在此范围之外,您将始终必须使用 "full"Node<список аргументов шаблона>
。如果模板方法的定义
Node<T>
是在模板类之外完成的,那么由于上述原因,在返回类型中,您不能再缩短Node<T>
到Node
使用“经典”语法时。正确但是,如果模板类型规范很长并且您不想重复两次,则可以使用新语法
在这种情况下,您可以使用右侧的“短”名称
Node
。而且,正如您已经被告知的,不应将模板实体的定义提取到
.cpp
文件中。即使你把它们放在类之外,它们仍然应该放在头文件中,紧挨着类定义。;
在类中定义方法后附加不是错误,而是不必要的空声明。
也不清楚为什么在一个类中直接在类定义中为字段使用初始化器,而在另一个类中则顽固地拒绝。
发生错误是因为该类
Node
缺少模板参数。next_node
将and字段的类型更改back_node
为,以及and方法Node<T> *
的返回类型。getNext
getBack
首先,您应该将整个模板类定义(包括它们的成员)放在标题中。
其次,在某些函数中,您忘记定义模板标识符。
以下是标题以及相应的更改。