1

こんにちは、私は循環キューを開発しようとしていますが、この実装は 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);

クラスを準専門化クラスに再実装する必要がありますか??

4

2 に答える 2

2

この問題は、次のデータ メンバーが原因で発生します。

R array[capacity];

R配列にはすでにすべての要素が含まれているため、各要素に対してのコンストラクターを呼び出す必要があります。std::vector代わりに使用しないのはなぜですか?

于 2013-08-06T15:04:13.023 に答える
0

explicitコードに示されている方法でキーワードを使用するのをやめてください。クラスで void コンストラクターを作成するPutMessageと、正常に動作するはずです。

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

nullptrレコードには、0 の代わりに無効なポインターを割り当てます。

編集:ただし、をより適切に実装するには、要素を構築するためにキュースペースとプレースメント new を割り当てるためにCircularQueue実際に使用する必要があります。operator new()ただし、代わりにスタックを使用することを指定する設計要件がある可能性があるため、これは私の元の回答の一部ではありません。

于 2013-08-06T15:17:50.670 に答える