模板类难度大

时间:2012-03-26 21:48:30

标签: c++ class templates stack

好吧,伙计们我一直在尝试定义一个堆栈,每个节点也是模板类型但是当编译时我得到了十几种不同类型的错误。我将粘贴使用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'之前预期的类型说明符”

2 个答案:

答案 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进行实例化,但第二次将其视为类。它不可能都是。