2013-08-23 216 views
0

我正在嘗試編寫一個deque的容器類來創建一個循環緩衝區(使用deque在這裏很重要,因爲類正在替換一個向量,並且確實需要在這裏使用)。我不想讓容器類專用於特定的雙端隊列;也就是說,我希望該類是模板類,並使用雙端隊列來獲取模板類型。但是,我的代碼在編譯時使用未定義類型錯誤(c:\ program files(x86)\ microsoft visual studio 10.0 \ vc \ include \ deque(795):error C2027:使用未定義類型'dequeClass')。將模板傳遞給deque

代碼:

#pragma once 

#include <deque> 

template<typename dequeClass> 
class CircularDeque { 
public: 
    CircularDeque(int newMax); 
    ~CircularDeque(); 
    void push_front(dequeClass&& val); 
    void push_front(const dequeClass& val); 
    void push_back(dequeClass&& val); 
    void push_back(const dequeClass& val); 
    std::deque<dequeClass> que; 
    int getMax(); 
    void setMax(int newMax); 
private: 
    unsigned int max; 
}; 

CircularDeque<class dequeClass>::CircularDeque(int newMax) { 
    max = newMax; 
} 

void CircularDeque<class dequeClass>::push_front(dequeClass&& val) { 
    que.push_front(val); 
    if(que.size() > max) { 
     que.pop_back(); 
    } 
} 

void CircularDeque<class dequeClass>::push_front(const dequeClass& val) { 
    que.push_front(val); 
    if(que.size() > max) { 
     que.pop_back(); 
    } 
} 

void CircularDeque<class dequeClass>::push_back(dequeClass&& val) { 
    que.push_back(val); 
    if(que.size() > max) { 
     que.pop_front(); 
    } 
} 

void CircularDeque<class dequeClass>::push_back(const dequeClass& val) { 
    que.push_back(val); 
    if(que.size() > max) { 
     que.pop_front(); 
    } 
} 

int CircularDeque<class dequeClass>::getMax() { 
    return max; 
} 

void CircularDeque<class dequeClass>::setMax(int newMax) { 
    max = newMax; 
} 

任何人都知道我能做些什麼嗎?

+1

如果你只是想專注一個'的std :: deque'的行爲,爲什麼不從它繼承?只要你不添加任何數據成員,你就不需要虛擬析構函數,所以通過繼承來完成它將刪除很多重複的代碼,否則你最終會寫。 –

+0

@ZacHowland真的,這將顯着減少我必須做的改變。我會試試看。 – demize

+3

請記住,由於STL容器沒有虛擬析構函數,因此不需要添加數據成員(因此您必須將模板修改爲像'template circular_deque:public std :: deque {...};' –

回答

1

模板類的每個內聯成員必須以模板參數列表開頭。 IE瀏覽器。這樣的:

CircularDeque<class dequeClass>::CircularDeque(int newMax) { 
    max = newMax; 
} 

應該是這樣的:

template<class dequeClass> 
CircularDeque<dequeClass>::CircularDeque(int newMax) { 
    max = newMax; 
} 

做到這一點對所有的外的類的定義。

+0

非常感謝你,它現在編譯。我會接受答案,當我可以,它hasn還不夠長。 – demize

0

把你的函數定義在線或模板聲明像這樣在前面加上他們:

template<typename dequeClass> 
CircularDeque<class dequeClass>::CircularDeque(int newMax) { 
    max = newMax; 
}