我有以下代码结构:
class myClass
{
public:
void DoSomething(void);
};
#include myClass.h
static const unsigned length = 5;
static myArray<float, length> arrayX;
void myClass::DoSomething(void)
{
// does something using length and array X
}
现在我想将在文件范围定义的静态变量转换为类的静态成员。我做了以下事情;
class myClass
{
static const unsigned length;
static myArray<float,length> arrayX;
public:
void DoSomething(void);
};
#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
我知道我收到此错误,因为长度尚未在头文件中初始化。我怎么能绕过这个?
答案 0 :(得分:4)
它必须是一个常量表达式,因此您可以做的最好的事情就是将= 5
移到标题中。
答案 1 :(得分:1)
然而,我想知道是否有办法解决这个问题。
再次查看您的代码。 myArray<float,length>
被声明为标题中的类数据成员
为了让编译器知道myClass
是什么,它必须知道该数据成员的完整定义。但是myArray<float,length>
的完整定义反过来需要知道length
,因为没有模板参数,myArray
不是类型,而是模板,数据成员必须是类型,而不是类模板。
从中可以清楚地看到,为了将myArray
实例作为类成员,在编译类时必须知道length
,myArray
是成员的。
答案 2 :(得分:0)
你试过了吗?
myArray<float, myClass::length> myClass::arrayX;
^^^^^^^^^^
您可能还需要更改标题:
class myClass
{
static const unsigned length = 5;
并将.cpp中myClass :: length的定义更改为不包含“= 5”(或完全删除它)。