模板函数参数有什么问题

时间:2014-10-16 15:13:56

标签: c++ templates

嗨,我是模板新手。只是想知道如何正确编译程序。

 template<class t>
 class node{
    public: 
       t val;
       node(t v):val(v){}
 };
 template<class t>
 class stack{
   private: 
     stack *next;
     static stack *head;
     static int top;
   public:  
     void push(node *n);
     node* pop();
 };
 template<class t>
 int stack<t>::top=0;
 template<class t>
 stack<t>* stack<t>::head=NULL;
 template<class t>
 void stack<t>::push(node<t>* n)   //Error the push function is not defined properly
 {

 }


 int main(int argc, char *argv[])
 {
    node<int> n1(5);
    return 0;
 }

程序出错

  stack<t>::push' : redefinition; different basic types
     nw.cpp(14) : see declaration of 'stack<t>::push'

提前致谢

4 个答案:

答案 0 :(得分:1)

类模板node需要模板参数

使用node<t>

void push(node<t> *n);node<t>* pop();并根据实施情况

答案 1 :(得分:0)

宣言:

void push(node *n);

应该是:

void push(node<t> *n);

答案 2 :(得分:0)

  public:  void push(node *n);

应该是

  public:  void push(node<t> *n);

答案 3 :(得分:0)

node是一个类模板,因此即使在声明中也需要它的模板参数:

void     push(node<n> *n);
node<t>* pop();

您可以在参数声明中保留模板参数的唯一方案是声明出现在类作用域本身中。在这种情况下,node被称为注入的类名

此外,正如评论所指出的那样,headtop不应该是静态数据成员。这会禁止创建独立的堆栈实例,并且在使用它们时会引起很多混淆。相反,将它们设为非静态数据成员,以便它们仅引用正在使用的实例。