Подтвердить что ты не робот

Инициализация статического массива строк (С++)?

Я не могу за всю жизнь понять, как это сделать должным образом. У меня есть класс, который должен хранить некоторые константы (текст, соответствующий значениям в типе enum). Я объявлял это (публично) в своем классе:

const static char* enumText[];

И я пытаюсь инициализировать его следующим образом:

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

Однако gcc дает мне следующую ошибку:

'const char * MyClass:: enumText []' не является статическим членом класса MyClass

Что я делаю неправильно? Спасибо!

4b9b3361

Ответ 1

Этот код компилируется:

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

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

Проверьте свой код и найдите различия. Я могу только думать, что вы не определили статический атрибут в классе, вы забыли включить заголовок или вы ошибочно указали имя.

Ответ 2

Скомпилируется с 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 ссылается на правильный класс?

Ответ 3

Как говорит компилятор, вы пытаетесь определить статический член MyClass который будет представлять собой массив const char* именем enumText. Если у вас нет этого объявления в классе, то есть проблема.

У тебя должно быть:

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

или, может быть, вы не хотели статический член. Если нет, вам не нужно использовать класс в имени.

Во всяком случае, это не имеет ничего общего с инициализацией массива.

Ответ 4

Учитывая сообщение об ошибке, мне кажется, что у вас есть объявление MyClass где-нибудь (в другом заголовке, возможно?), который не имеет enumText [], объявленного в нем. Сообщение об ошибке указывает, что компилятор знает о MyClass, но он не знает о члене enumText.

Я бы посмотрел, есть ли у вас несколько объявлений MyClass, скрывающихся в тени.

Можете ли вы получить wintermute's или примеры T.E.D. для компиляции?

Ответ 5

Следующий код компилируется для меня отлично в VS 2005:

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

Если бы мне пришлось угадать, я бы сказал, что ваша строка инициализации находится в отдельном исходном файле, и вы забыли # включить файл .h, содержащий MyClass. Это то, что я виню и делаю все время.

Кроме того, мне кажется весьма вероятным, что у вас есть const в неправильном месте (или их недостаточно). Теперь у вас есть это, это не массив, который является постоянным, или указатели в массиве; просто элементы символа внутри него.