stl — c ++ шаблонная специализация в круговой очереди

Привет я пытаюсь разработать круговую очередь, но эта реализация отлично работает для базовых типов, таких как 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);

Должен ли я переопределить класс в класс полуспециализации?

1

Решение

Проблема вызвана этим членом данных:

R array[capacity];

Массив уже содержит все свои элементы, и поэтому вызов RКонструктор нужен для каждого. Почему бы не использовать std::vector вместо?

2

Другие решения

Прекратить использование explicit Ключевое слово, как показано в вашем коде. В вашем PutMessage класс, сделайте конструктор void, и он должен работать нормально:

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

Для записи, присвойте неверные указатели nullptr вместо 0.

Изменить: хотя, для лучшей реализации CircularQueue, вы должны действительно использовать operator new() назначить место в очереди и разместить новое для создания элементов. Тем не менее, могут существовать некоторые требования к дизайну, которые определяют использование стека вместо этого, поэтому это не является частью моего первоначального ответа.

0

По вопросам рекламы [email protected]