【问题标题】:Using templates to define static arrays in a class使用模板在类中定义静态数组
【发布时间】:2013-04-12 22:17:05
【问题描述】:

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

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&lt;char&gt;('\0',15); //allocate 15 byte array to i from buffer and initialized to '\0'

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

即:string* j = myBuff.New&lt;string&gt;("Hello Stack Overflow!"); //allocate memory to string object j from buffer and initialize

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

Buff&lt;1024*1024&gt; myBuff;

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

编辑:我得到了这个与下面的建议一起工作。我想我很困惑为什么

'模板'

需要在类中的每个函数之上,即使在该函数中没有使用 S。这只是需要,因为它已经结束了课程吗? 感谢您的知识!

【问题讨论】:

  • 您需要显示实际错误,以及使用它的实际代码。在有问题的版本中
  • pAllocBuff() 是错字吗?应该是Buff()
  • 是的,这是一个错字,对不起。它只是 Buff()。
  • Is this just required because it is over the class? 是的,这是必需的,因为您正在定义 类模板 的成员,并且甚至没有声明该类的非模板版本。

标签: c++ templates


【解决方案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;
}

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

【讨论】:

  • 这行得通!我尝试过类似的方法,但以前没有用。我一定是把什么东西放错了地方或什么的。你能解释为什么每个成员函数都需要 template ,即使没有使用 S 吗?此外,通过将缓冲区声明为静态,这是否意味着该类的其他实例与 h 共享相同的缓冲区?再次感谢。
  • @radensb 为什么不比较两者,以便您了解问题所在并从经验中学习?干杯
  • 这个我改过很多次了,没什么可比的。我只记得以前尝试过这样的事情,但我敢打赌,我从来没有将 template 代码放在每个成员函数之上,这可能是 VS 将其标记为错误的原因。
  • @radensb 我衷心建议 (a) 采取小步骤 (b) 使用版本控制(例如 Windows 上的 Mercurial,它使用 TortoiseHg 进行了出色的 shell 集成)
猜你喜欢
  • 2016-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-20
  • 1970-01-01
  • 2015-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多