您好我正在尝试开发循环队列,但此实现适用于基本类型,如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);
我是否必须将类重新实现为半专业化类?
答案 0 :(得分:2)
问题是由此数据成员引起的:
R array[capacity];
数组已包含其所有元素,因此每个元素都需要调用R
的构造函数。为什么不使用std::vector
?
答案 1 :(得分:0)
停止使用代码中显示的explicit
关键字。在你的PutMessage
类中,创建一个void构造函数,它应该可以正常工作:
PutMessage() : PutMessage(0,0,0) {}
对于记录,请将无效指针指定给nullptr
而不是0。
编辑:虽然为了更好地实现CircularQueue
,您应该使用operator new()
来分配队列空间和新位置以构建元素。但是,可能有一些设计要求指定使用堆栈,这就是为什么这不是我原来答案的一部分。