好吧,伙计们我一直在尝试定义一个堆栈,每个节点也是模板类型但是当编译时我得到了十几种不同类型的错误。我将粘贴使用char类型堆栈的程序并尝试弹出字母'e'
#ifndef STACK_LIST_H
#define STACK_LIST_H
#include "List.h"
using namespace std;
template <class T>
class Stack {
public:
T pop();
void push(T x);
T isEmpty();
T top();
private:
int size;
Node<T> * headNode;
Node<T> * currentNode;
};
#endif
现在功能定义:
#include <iostream>
#include "Stack_list.h"
using namespace std;
template <class T>
T Stack<T>::pop(){
T x = headNode->get();
Node<T>* p = new Node<T>::Node();
p = headNode;
headNode = headNode->getNext();
delete p;
return x; }
template <class T>
void Stack<T>::push(T x){
Node<T>* newNode = new Node<T>::Node();
newNode->setNext(headNode);
newNode->set(x);
headNode=newNode;
}
template <class T>
int Stack<T>::isEmpty(){
return (headNode ==NULL);}
template <class T>
T Stack<T>::top(){
return headNode->get();
}
现在是模板类节点:
#ifndef LIST_H
#define LIST_H
using namespace std;
/* The Node class */
template <class T>
class Node
{
public:
Node(T here){object=here;};
T get() { return object; };
void set(T object) { this->object = object; };
Node<T>* getNext() { return nextNode; };
void setNext(Node<T>* nextNode) { this->nextNode = nextNode; };
Node<T>* getPrev(){ return prevNode;};
void setPrev(Node<T>* prevNode){this->prevNode=prevNode;};
private:
T object;
Node<T>* nextNode;
Node<T>* prevNode;
};
#endif
最后是唤起课程的程序:
#include <iostream>
#include "Stack_list.cpp"
using namespace std;
int main(){
Stack <char>s;
s.push("e");
cout<<s.pop();
}
如您所见,这是我第一次尝试模板类。在Stack :: pop()和push(T)的定义中,它说“在'Node'之前预期的类型说明符”
答案 0 :(得分:1)
您的方法定义签名是:
T Stack<T>::pop()
但他们应该
template<typename T>
T Stack<T>::pop()
此外,由于Stack
使用Node
,您必须在Node.h
中添加Stack.h
。
此外 - 您在Stack
中声明了T isEmpty();
,但将其实施为int Stack<T>::isEmpty()
。坚持一种返回类型(这里可能bool
更合适,但int
也可以。)
最后:
Stack <char>s;
s.push("e");
模板专精化为char
,但"e"
为const char*
。正确的方法是:
Stack <char>s;
s.push('e'); // <- note the single quotes
答案 1 :(得分:1)
Node<T>* newNode = new Node()
不一致。 Node
是类还是类模板?第一次提到它时,您将其视为模板并使用T
进行实例化,但第二次将其视为类。它不可能都是。