C++ c++;循环队列中的模板专门化

C++ c++;循环队列中的模板专门化,c++,stl,circular-buffer,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);

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

};
模板
类循环队列{
公众:
显式循环队列(constr&aeelement);
~CircularQueue()
{
}
bool push(const R&aElement);
布尔波普(R&AELENT);
bool isEmpty()常量;
bool isFull()常量;
私人:
循环队列(){}
循环队列(const CircularQueue&);
常量循环队列&运算符=(常量循环队列&);
int递增(int)常量;
静态const size\u t capacity=aSize+1;
R阵列[容量];
挥发性内特尾;
挥发性内质头;
};
但当我尝试将其特殊化为自定义类型时,编译器告诉我必须调用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;
};
}
class-PutMessage:public-IMetodo,Sujeto
{
公众:
显式PutMessage(仆人*aServant=0,男人*aMensaje=0,观察者*aFuture=0);
虚拟~PutMessage();
bool-guard()常量;
int getResult()常量;
无效调用();
Mensaje*getMensaje()常量;
Servant*getServant()常量;
bool hasfourture()常量;
私人:
PutMessage();
仆人*仆人;
Mensaje*mMensaje;
int-mResult;
布尔·姆哈斯的未来;
};
}
对循环队列的调用:

CircularQueue<PutMessage,32> aCircular(*aMessageQueue);
CircularQueue环形(*aMessageQueue);

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

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

R array[capacity];

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

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

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

对于记录,将无效指针分配给
nullptr
,而不是0


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

看起来这个类是按值存储其内容的,这意味着PutMessage将必须有一个公共副本构造函数等-如果您要存储指针,即您编写的循环队列,我必须将该部分重新实现为堆上的数组,可能是因为它导致编译器调用构造函数@PeterHull或指定移动构造函数或
emplace\u back(…)
。对于记录,
std::vector
也使用了复制和移动构造函数。问题是由于堆栈中的数组声明,我在堆上重写了它,只使用指针,但我不认为使用std::vector是一个更好的解决方案。只有当编译器隐式转换实际上会破坏代码imo时,才应使用显式转换。在函数中,指针作为参数,编译器不会隐式转换,因此它是多余的。此外,我想冒昧地说,您的
volatile
在这里也有些多余。顺便说一句,当我写下我的答案时,我并没有真正思考,而当前的
PutMessage
构造函数作为一个空构造函数应该可以很好地工作。我不完全确定问题出在哪里了(我认为制作一个R数组应该是可行的)。哦,我现在明白了!隐藏在
PutMessage
private
部分中,已经有一个空构造函数!完全错过了
CircularQueue
无法构造数组,因为无效构造函数是私有的。