Привет я пытаюсь разработать круговую очередь, но эта реализация отлично работает для базовых типов, таких как 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);
Должен ли я переопределить класс в класс полуспециализации?
Проблема вызвана этим членом данных:
R array[capacity];
Массив уже содержит все свои элементы, и поэтому вызов R
Конструктор нужен для каждого. Почему бы не использовать std::vector
вместо?
Прекратить использование explicit
Ключевое слово, как показано в вашем коде. В вашем PutMessage
класс, сделайте конструктор void, и он должен работать нормально:
PutMessage() : PutMessage(0,0,0) {}
Для записи, присвойте неверные указатели nullptr
вместо 0.
Изменить: хотя, для лучшей реализации CircularQueue
, вы должны действительно использовать operator new()
назначить место в очереди и разместить новое для создания элементов. Тем не менее, могут существовать некоторые требования к дизайну, которые определяют использование стека вместо этого, поэтому это не является частью моего первоначального ответа.