2010-11-18 72 views
2

我寫了這個東西樣堆棧數據結構:堆模板不編譯推FUNC

template<class T> 
class Stos { 
    class Element { 
     public: 
     T n; 
     Element* prev; 
     Element(const T& k = 0): n(k), prev(0) {} 
    }; 
    Element* member; 
    Stos(Stos&); 
    public: 
    Stos(const T&); 
    ~Stos(); 
    unsigned int count; 
    T get(); 
    Element* push(const T&); 
    T pop(); 
    void mod(const T&); 
}; 

與實現(同一個文件):

template<class T> 
Stos<T>::Stos(const T& n = 0): count(1) { 
    member = new Element(n); 
} 

template<class T> 
T Stos<T>::get() { 
    return member->n; 
} 

template<class T> 
Stos<T>::Element* Stos<T>::push(const T& n = 0) { 
    Element* point = member; 
    member = new Element; 
    member->prev = point; 
    if(n != 0) member->n = n; 
    ++count; 
    return member; 
} 

template<class T> 
T Stos<T>::pop() { 
    Element* point = member; 
    T n = point->n; 
    member = point->prev; 
    --count; 
    delete point; 
    return n; 
} 

template<class T> 
void Stos<T>::mod(const T& n) { 
    member->n = n; 
} 

template<class T> 
Stos<T>::~Stos() { 
    while(member) pop(); 
} 

當我嘗試編譯用g ++,我得到關於Stos::Element* Stos::push()定義的第一行的這個錯誤:expected constructor, destructor, or type conversion before ‘*’ token。這是我第一次嘗試用模板寫東西。這個堆棧代碼在沒有模板的情況下工作,當我編輯它的時候,然後我得到了錯誤,所有的東西都很好用,而且每個地方都用「int」而不是「T」。

而我找不出爲什麼它不編譯。我不能使用指向class :: member的指針嗎?

回答

5

您需要typename

typename Stos<T>::Element* Stos<T>::push(const T& n = 0) 

的前綴名Element這裏有一個鏈接到爲什麼這是必要的充分解釋

+0

謝謝,它的工作原理。 – silmeth 2010-11-18 20:04:55

+1

當問題被標記爲C++,並且在主題中發現「模板」和「編譯」時,StackOverflow應該自動地「你需要類型名稱」。 – 2010-11-18 20:06:14

+1

即使「從VS移植」被包含在問題的某處:-) – mmmmmmmm 2010-11-18 21:31:49

2

你也應該考慮使用

const T &n = T() 

代替

const T &n = 0 

由於並非所有可能的T可以是能夠從0初始化!

+0

嗯,我相信我只是不應該讓push()沒有參數與未知的T ;-)。 – silmeth 2010-11-18 23:48:54