1

これは本当に簡単だと思いましたが、まだ機能していません。テンプレートを使用して、クラスの静的 unsigned char 配列データ メンバーのサイズを定義したいと考えています。使用するデータ型を定義するために 2 つの関数でテンプレートを使用していますが、これは正常に機能します。私は次のようなことを考えていました:

template<unsigned S>
class Buff
{
private:
    static unsigned char buffer[S];
    int offset;
public:
    pAllocBuff(){offset=0;};
    template <typename T>
    T* New(T, int);
    template <typename T>
    T* New(T);

};   

アイデアは、New(T, int) がバッファからメモリをデータ型配列に割り当てるというものです。

すなわち:char* i = myBuff.New<char>('\0',15); //allocate 15 byte array to i from buffer and initialized to '\0'

または New(T) は、単一のデータ型のバッファからメモリを割り当てます

すなわち:string* j = myBuff.New<string>("Hello Stack Overflow!"); //allocate memory to string object j from buffer and initialize

'S' を BUFFSIZE に置き換え、#define BUFFSIZE 1024*1024 (または何でも) を使用すると、すべてがうまく機能します。しかし、バッファのサイズを Buff の異なるインスタンスに対して定義できるようにしたいと考えています。以下のようなので:

Buff<1024*1024> myBuff;

これを行うと、クラスのすべてのメンバー関数に、テンプレート引数が欠落しているというフラグが立てられますが、S はそれらとは何の関係もありません。

編集:以下の提案でこれを機能させました。なぜ私は混乱していると思います

'テンプレート'

S がその関数で使用されていなくても、クラス内のすべての関数の上にある必要があります。これは授業を超えているので必要ですか?あなたの知識をありがとう!

4

1 に答える 1

1

とにかく、これは私にとってはうまくいきます:http://liveworkspace.org/code/3L72Lq$0

template<unsigned S>
class Buff
{
private:
    static unsigned char buffer[S];
    int offset;
public:
    Buff() : offset() {}
    template <typename T> T* New(T, int);
    template <typename T> T* New(T);
};   

template<unsigned S>
/*static*/
    unsigned char Buff<S>::buffer[S] = {0};

template<unsigned S>
    template <typename T> T* Buff<S>::New(T, int)
{
    return nullptr; // TODO
}

template<unsigned S>
    template <typename T> T* Buff<S>::New(T)
{
    return nullptr; // TODO
}

int main()
{
    Buff<(1u<<12)> one;
    Buff<(1u<<14)> two;
}

クラス外で定義されたクラステンプレート内のメンバー関数テンプレートの小さな構文事故だと確信しています(これは表示されませんでした)。

于 2013-04-12T22:25:07.673 に答える