1

嗨,我正在尝试开发一个循环队列,但是这种实现对于 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);

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

4

2 回答 2

2

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

R array[capacity];

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

于 2013-08-06T15:04:13.023 回答
0

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

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

为了记录,分配无效的指针nullptr而不是 0。

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

于 2013-08-06T15:17:50.670 回答