使用模板在类中定义静态数组

时间:2013-04-12 22:17:05

标签: c++ templates

我认为这很容易,但我还没有完成这项工作。我想使用模板来定义类的静态unsigned char数组数据成员的大小。我在我的两个函数上使用模板来定义正在使用的数据类型,并且工作正常。我在想这样的事情:

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)从缓冲区为数据类型数组分配内存。

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

或New(T)从缓冲区为单个数据类型分配内存

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

如果我用BUFFSIZE和#define BUFFSIZE 1024 * 1024(或其他)替换'S',一切都很好。但我想这样做,以便可以为不同的Buff实例定义缓冲区的大小。所以,像:

Buff<1024*1024> myBuff;

当我这样做时,我的类中的所有成员函数都被标记为缺少模板参数,即使S与它们无关。

编辑:我得到了以下建议。我想我很困惑为什么

'模板'

需要高于类中的每个函数,即使S未在该函数中使用。这只是必需的,因为它是在课堂上吗? 谢谢你的知识!

1 个答案:

答案 0 :(得分: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;
}

我确定这是类模板中的成员函数模板的一个小的语法错误,它是在类外定义的(你没有显示)。