循环队列中的c++模板专用化
c++ template specialization in circular queue
嗨,我正在尝试开发一个循环队列,但这种实现对于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()
来分配队列空间和新的位置来构造元素。然而,可能有一些设计要求指定使用堆栈,这就是为什么这不是我最初答案的一部分。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 调用专用模板时出错"no matching function for call to [...]"
- 模板专用化(按容器):value_type
- 静态数据成员模板专用化的实例化点在哪里
- 特征 3 类的模板专用化
- Visual Studio 2017 不允许我创建 C++ 专用模板
- 字符串化递归的"std::vector<std::vector<...>>"而不使用部分模板函数专用化
- 具有常量引用参数的函数模板专用化
- 使用其他模板的模板专用化
- 使用专用显卡进行 OpenGL 渲染时帧速率较低
- 嵌套模板显式专用化
- 如何检查模板专用化是否是基本模板的子类?
- C++:部分模板专用化用例
- 通过依赖类型使用非类型模板参数的单类型模板参数类模板的部分专用化
- 使用对象的基类部分模板专用化对对象进行哈希处理::哈希
- 在 C++20 中是否不再允许在 std 中对程序定义类型的函数模板进行专用化?
- 为什么依赖模板类型在部分专用化中不可推导?
- 如何为静态常量模板化专用整数值分配存储
- 模板类的部分模板专用化,如 std::function
- 合并一组模板专用化