C++ c++;循环队列中的模板专门化
嗨,我正在尝试开发一个循环队列,但是这个实现对于int float之类的基本类型来说效果很好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);
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
无法构造数组,因为无效构造函数是私有的。