[英]c++ template specialization in circular queue
嗨,我正在嘗試開發循環隊列,但是此實現對於基本類型(如int float等)都很好用,
template<typename R, size_t aSize=200>
class CircularQueue{
public:
explicit CircularQueue(const R & aElement);
~CircularQueue()
{
}
bool push(const R & aElement);
bool pop(R & aElement);
bool isEmpty() const ;
bool isFull() const ;
private:
CircularQueue(){}
CircularQueue(const CircularQueue &);
const CircularQueue & operator=(const CircularQueue &);
int incrementar(int ) const;
static const size_t capacity=aSize+1;
R array[capacity];
volatile int tail;
volatile int head;
};
但是,當我嘗試將其專門化為自定義類型時,編譯器告訴我必須調用especif構造函數:Especif類
class PutMessage: public IMetodo, Sujeto<PutMessage>
{
public:
explicit PutMessage(Servant * aServant = 0,Mensaje * aMensaje=0, Observer<PutMessage> * aFuture=0);
virtual ~PutMessage();
bool guard() const;
int getResult() const ;
void call();
Mensaje * getMensaje() const;
Servant * getServant() const;
bool hasFuture() const;
private:
PutMessage();
Servant * mServant;
Mensaje * mMensaje;
int mResult;
bool mHasFuture;
};
}
循環隊列調用:
CircularQueue<PutMessage,32> aCircular(*aMessageQueue);
我是否需要將類重新實現為半專業化類?
此問題是由以下數據成員引起的:
R array[capacity];
一個數組已經包含了所有元素,因此每個數組都需要調用R
的構造函數。 為什么不使用std::vector
代替呢?
停止以代碼中顯示的方式使用explicit
關鍵字。 在您的PutMessage
類中,創建一個void構造函數,它應該可以正常工作:
PutMessage() : PutMessage(0,0,0) {}
對於記錄,將無效指針分配給nullptr
而不是0。
編輯:雖然,為了更好地實現CircularQueue
,您應該真正使用operator new()
來分配隊列空間和new位置以構造元素。 但是,可能會有一些設計要求指定使用堆棧代替,這就是為什么這不是我的原始答案的一部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.