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

标签 c++ templates

我认为这真的很容易,但我还没有开始工作。我想使用模板来定义类的静态无符号字符数组数据成员的大小。我在我的两个函数上使用模板来定义正在使用的数据类型,并且效果很好。我在想这样的事情:

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。这只是因为它已经结束了类(class)吗? 感谢您的知识!

最佳答案

无论如何,这对我来说很好: 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;
}

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

关于c++ - 使用模板在类中定义静态数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15981740/

相关文章:

python - _ZSt28__throw_bad_array_new_lengthv 尝试在编译共享对象后在 Python 中导入 C++ 代码

c++ - Xlib 致命 IO 错误 : 11 (resource temporarily unavailable) caused by not using XCloseDisplay()

c++ - "show"未在此范围内声明

C++11 - std::declval<T>() 方法名称

c++ - 存储多个可变大小的 std 数组

c++ - 成员访问和模板特化

c++ - 如何编写模板以基于整数/枚举转换为模板化类型

javascript - 使用 Vue JS 将参数作为 Html 中的变量传递给模板的问题

c++ - 类构造函数优先级与值包装器的可变模板构造函数

c++ - 一次读取完整文件是个好主意吗?