如何使用静态成员作为模板参数?

时间:2010-09-18 19:32:55

标签: c++ templates

我有以下代码结构:

myClass.h

class myClass
{
public:
    void DoSomething(void);
};

myClass.cpp

#include myClass.h

static const unsigned length = 5;
static myArray<float, length> arrayX;

void myClass::DoSomething(void)
{
    // does something using length and array X
}

现在我想将在文件范围定义的静态变量转换为类的静态成员。我做了以下事情;

myClass.h

class myClass
{
    static const unsigned length;
    static myArray<float,length> arrayX;

public:
    void DoSomething(void);
};

myClass.cpp

#include myClass.h

const unsigned myClass::length = 5;
myArray<float, length> myClass::arrayX;

void myClass::DoSomething(void)
{
    // does something using length and array X
}

然而,我收到错误:

  

C2975:'Length':'myArray'的模板参数无效,预期的编译时常量表达式myClass.h

我知道我收到此错误,因为长度尚未在头文件中初始化。我怎么能绕过这个?

3 个答案:

答案 0 :(得分:4)

它必须是一个常量表达式,因此您可以做的最好的事情就是将= 5移到标题中。

答案 1 :(得分:1)

  

然而,我想知道是否有办法解决这个问题。

再次查看您的代码。 myArray<float,length>被声明为标题中的类数据成员 为了让编译器知道myClass是什么,它必须知道该数据成员的完整定义。但是myArray<float,length>的完整定义反过来需要知道length,因为没有模板参数,myArray不是类型,而是模板,数据成员必须是类型,而不是类模板。

从中可以清楚地看到,为了将myArray实例作为类成员,在编译类时必须知道lengthmyArray是成员的。

答案 2 :(得分:0)

你试过了吗?

myArray<float, myClass::length> myClass::arrayX;
               ^^^^^^^^^^

您可能还需要更改标题:

class myClass
{
    static const unsigned length = 5;

并将.cpp中myClass :: length的定义更改为不包含“= 5”(或完全删除它)。