2009-09-03 105 views
12

我不能为我的生活弄清楚如何正确地做到这一点。我有一个需要存储一些常量(对应于值的枚举类型的文本)类 - 我有它在我的类中声明是这样的(公开):初始化字符串的静态数组(C++)?

const static char* enumText[]; 

而且我想初始化像这样:

const char* MyClass::enumText[] = { "A", "B", "C", "D", "E" }; 

但是GCC给了我以下错误:

'为const char * MyClass的:: enumText []' 是不是 'MyClass类'

什么时的静态成员我做错了?谢谢!

+0

尝试:static const char * enumText [];在课堂里? – 2009-09-03 22:20:28

+0

我强烈怀疑这是一些较老的g ++版本,它将'const static char * []'错误地当作'static char * [] const'而不是'static const char * []'(因为'static'处于一个“不寻常”的地方)。 – 2009-09-03 22:45:46

+0

您可以将完整且可编译的代码粘贴到显示问题的答案中吗? – sbi 2009-09-04 07:58:58

回答

13

此代码编译:

struct X { 
    static const char* enumtext[]; 
}; 

const char* X::enumtext[] = { "A", "B", "C" }; 

检查你的代码,并找到差异。我只能认为你没有在类中定义静态属性,你忘记了包含标题,或者错误地输入了名称。

+9

第5行应该有'X :: enumtext',否则你只是创建一个新的变量。 – 2009-09-03 22:28:24

+0

这是一个错误的答案,我纠正了它。无论如何,代码确实使用gcc进行编译(MacOSX中的4.0和Ubuntu中的4.3) – 2009-09-04 11:59:27

+0

Wooo我觉得很愚蠢,我有一个我没注意到的错字。 – 2009-09-04 13:20:24

1

正如编译器所说,你正试图定义一个MyClass的静态元素,它将是一个名为enumText的const char *数组。如果你没有在课堂上申报,那就有问题了。

你应该有:

class MyClass 
{ 
    //blah 
    static const char* enumText[]; 
}; 

或者你did'nt想要一个静态成员。如果不是,你不应该在名字中使用一个类。

无论如何,这与数组初始化无关。

+0

欧普说:“我已经在我的课堂上公开了这样的声明” – snarf 2009-09-03 22:47:17

+0

@Snarfblam:但是OP所说的和现实通常是两回事 - 尤其是因为他说他所做的事情应该起作用。 – 2009-09-03 22:50:32

1

下面的代码编译就好了,我在VS 2005:

class MyClass 
{ 
const static char* MyClass::enumText[]; 
}; 
const char* MyClass::enumText[] = { "A", "B", "C", "D", "E" }; 

如果我不得不采取胡乱猜测,我会说,你动初始化线是在一个单独的源文件,你忘了#包含包含MyClass的.h文件。这正是我一直搞砸的事情。

另外,我认为你很可能在错误的地方(或不足够他们)const。现在你已经拥有了它的方式,它不是常量的数组,或者是数组中的指针;只是其中的字符元素。

6

这将编译用gcc 4.0.1版本:

#include <iostream> 

class MyClass { 
public: 
    const static char* enumText[]; 
}; 

const char* MyClass::enumText[] = { "a", "b", "c" }; 

int main() 
{ 
    std::cout << MyClass::enumText[0] << std::endl; 
} 

编译时:

g++ -Wall -Wextra -pedantic s.cc -o s 

你肯定MyClass的::enumText被引用正确的类?

2

鉴于错误消息,在我看来,你有一个MyClass声明某处(在另一个标头也许?),它没有声明enumText []。错误消息表明编译器知道MyClass,但它不知道enumText成员。

我想看看您是否有多个暗示在阴影中的MyClass声明。

你能拿wintermute'sT.E.D.'s的例子来编译吗?