循环队列中的c ++模板特化

时间:2013-08-06 14:55:18

标签: c++ stl circular-buffer

您好我正在尝试开发循环队列,但此实现适用于基本类型,如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);

我是否必须将类重新实现为半专业化类?

2 个答案:

答案 0 :(得分:2)

问题是由此数据成员引起的:

R array[capacity];

数组已包含其所有元素,因此每个元素都需要调用R的构造函数。为什么不使用std::vector

答案 1 :(得分:0)

停止使用代码中显示的explicit关键字。在你的PutMessage类中,创建一个void构造函数,它应该可以正常工作:

PutMessage() : PutMessage(0,0,0) {}

对于记录,请将无效指针指定给nullptr而不是0。

编辑:虽然为了更好地实现CircularQueue,您应该使用operator new()来分配队列空间和新位置以构建元素。但是,可能有一些设计要求指定使用堆栈,这就是为什么这不是我原来答案的一部分。