嗨,我是模板新手。只是想知道如何正确编译程序。
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'
提前致谢
答案 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
被称为注入的类名。
此外,正如评论所指出的那样,head
和top
不应该是静态数据成员。这会禁止创建独立的堆栈实例,并且在使用它们时会引起很多混淆。相反,将它们设为非静态数据成员,以便它们仅引用正在使用的实例。