-2

テンプレート化されたクラスMyQueueを実装しようとしています(論理構造はリングバッファです):

// MyQueue.h
#pragma once
template<typename T>
class MyQueue
{
public:
    /* interface */
    MyQueue(int sizeOfBuffer);
    void push(const T& elem);
    T pop(void);

private:
    T* m_array;
};

template<typename T>
MyQueue<T>::MyQueue(int sizeOfBuffer)
{
    m_array = new T[sizeOfBuffer];
}

通常、テンプレートクラスでコンストラクターの実装に直面するときは、宣言で実装します。

#pragma once
template<typename T>
class MyQueue
{
public:
    /* interface */
    MyQueue(int sizeOfBuffer){// do some actions with argument sizeOfBuffer};
    void push(const T& elem);
    T pop(void);

private:
    T* m_array;
};

コンストラクターの本体は多くのスペースを占める可能性があるため、コードを読みやすくするために、宣言とは別に(ただし同じヘッダーに)実装することにしました
質問:私が間違っていることと、私の問題を解決する方法は?

4

1 に答える 1

3

これは、コンストラクターの本体をどのように記述したかとは関係ありません。

どこかでこのクラスのデフォルトで構築されたオブジェクトを作成しようとしているように見えますが、デフォルトのコンストラクターを提供していないという事実に関係しています。通常、コンパイラーはデフォルトのコンストラクターを合成しますが、引数を取るコンストラクターを作成したため、コンパイラーもそれを (自動的に) 行いません。

= default;最近のコンパイラでは、C++11 で導入された構文を使用して合成されたデフォルトのコンストラクタを取得できるはずです。それ以外の場合は、明示的に記述するか、既存のコンストラクターにデフォルトの引数を追加する必要があります (例: MyQueue(int sizeOfBuffer = 20);)。

于 2013-03-20T21:13:49.457 に答える