2014-10-16 39 views
1

嗨,我是模板的新手。只是想知道如何正確編譯程序。模板功能參數有什麼問題

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堆棧。 – 2014-10-16 15:17:32

+2

'node * n'和'node * n'不是一回事 – taocp 2014-10-16 15:17:35

回答

0

聲明:

void push(node *n); 

應該是:

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

類模板node需要模板參數

使用node<t>在:

void push(node<t> *n);node<t>* pop();,並在執行根據

0
public: void push(node *n); 

應該

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

node是一個類模板,以便它的模板參數是即使是在需要聲明:

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

中,你可以離開模板參數出參數聲明是當聲明出現在類範圍本身的唯一方案。在這種情況下node被稱爲注入類名稱

另外,正如評論指出的,headtop不應該是靜態數據成員。這會阻止創建獨立的堆棧實例,並且在使用它們時會造成很多混淆。相反,使它們成爲非靜態的數據成員,因此它們只能引用正在使用的實例。