模板实现细分错误;

时间:2017-11-14 10:10:52

标签: c++ templates

在将模板引入代码之前,一切正常 编辑: 这是我能够缩小范围的问题,感谢您的提示:

main.cpp中包含的文件:4: stack.cpp:在成员函数void Stack<TYPE>::push(Stack<TYPE>&, TYPE)': stack.cpp:35: error:中,node'不是类型

我想知道类似的问题是否会出现在pop函数的后期,但似乎没有。

我很困惑为什么它似乎坚持认为节点不是一个类型。

编辑#2: main.cpp文件中的这个语句现在引起了麻烦。我已将stack.cpp中的所有定义移至stack.h。在此Stack<int> list;后,我的编译说Segmentation fault (core dumped)

stack.h:

#include <iostream>

using namespace std;

template <typename TYPE>
struct node {
    TYPE data;
    node<Type> *next;
    node(){
        data = NULL;
        next = NULL;
    }
    ~node(){
        if (data!=0)
            delete next;
    }
    explicit node(int i){
        data = i;
    }
};
template <typename TYPE>
class Stack {
private:
    node<TYPE> *top;
    void init();
public:
    Stack(); // default constructor
    virtual ~Stack(); // destructor
    bool empty();
    void push(Stack&,TYPE);
    TYPE pop(Stack&);
    int peek();
    void clear();
    ostream& printf(ostream&, node<TYPE> *);
    ostream& print(ostream&);
    ostream& sequentialPrint(Stack&,ostream&);
    ostream& reversePrint(Stack&,ostream&);
    friend ostream& operator<<(ostream&, Stack&);

};

stack.cpp:

template <typename TYPE>
void Stack<TYPE>::push(Stack<TYPE> &s, TYPE i) {
    node<TYPE> * n = new node(i);
    n->next = top;
    top = n;
}
template <typename TYPE>
TYPE Stack<TYPE>::pop(Stack<TYPE> &s){
    if (empty()) {
        cerr<<"Stack is empty \n";
    }
    TYPE temp = s.top->data;
    top = top->next;
    return temp;
}

1 个答案:

答案 0 :(得分:0)

  1. friend ostream& operator<<(ostream&, Stack&);不需要
  2. 您无法在cpp文件中定义模板方法。必须在头文件中定义作为模板参数的模板的每个元素。