循环队列中的c++模板专用化

c++ template specialization in circular queue

本文关键字:专用 c++ 队列 循环      更新时间:2023-10-16

嗨,我正在尝试开发一个循环队列,但这种实现对于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构造函数:特定类别

    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()来分配队列空间和新的位置来构造元素。然而,可能有一些设计要求指定使用堆栈,这就是为什么这不是我最初答案的一部分。