2009-09-03 17 views
12

No puedo entender cómo hacer esto correctamente. Tengo una clase que necesita para almacenar algunas constantes (texto que corresponde a valores en un tipo de enumeración) - tengo que declaró como esto (públicamente) en mi clase:Inicializando una matriz estática de cadenas (C++)?

const static char* enumText[]; 

Y yo estoy tratando de inicializarlo de esta manera:

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

sin embargo gcc me da el siguiente error:

'const char * MyClass :: enumText []' no es un miembro estático de 'class MiClase'

Qué am Estoy haciendo mal? ¡Gracias!

+0

Probar: static const char * enumText []; ¿en la clase? –

+0

Sospecho fuertemente que esta es una versión anterior de g ++ que trata incorrectamente 'const static char * []' allí como 'static char * [] const' en lugar de' static const char * [] '(porque' static' está en un lugar "inusual"). –

+0

¿Podría pegar un fragmento de código completo y compilable en su respuesta que muestre el problema? – sbi

Respuesta

13

Este código se compila:

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

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

Compruebe su código y encontrar diferencias. Solo puedo pensar que no definiste el atributo estático en la clase, olvidaste incluir el encabezado o escribiste mal el nombre.

+9

La línea 5 debe tener 'X :: enumtext' o simplemente está creando una nueva variable. –

+0

Eso fue un error tipográfico en la respuesta, lo he corregido. De todos modos, el código se compila con gcc (4.0 en MacOSX y 4.3 en ubuntu) –

+0

Wooo me siento estúpido, tuve un error tipográfico que no noté ... –

1

Como dice el compilador, está intentando definir un miembro estático de MyClass que sería una matriz const char * llamada enumText. Si no tiene su declaración en la clase, entonces hay un problema.

Usted debe tener:

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

o tal vez desee did'nt un miembro estático. Si no, no deberías tener que usar una clase en el nombre.

De todos modos, eso no tiene nada que ver con la inicialización de la matriz.

+0

Op dice "Lo he declarado así (públicamente) en mi clase" – snarf

+0

@Snarfblam: pero a menudo lo que un OP dice y la realidad son 2 cosas diferentes, especialmente porque lo que dice que ha hecho debería funcionar. –

1

El siguiente código compila bien para mí en VS 2005:

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

Si tuviera que tomar una conjetura salvaje, yo diría que su línea initilization está en un archivo fuente por separado, y se le olvidó para #incluir el archivo .h que contiene MyClass. Eso es exactamente el tipo de cosas que arruino y hago todo el tiempo.

Además, parece bastante probable para mí que tenga la const en el lugar equivocado (o no la suficiente). La forma en que la tienes ahora, no es la matriz que es constante, o los punteros en la matriz; solo los elementos de personaje dentro de ella.

6

Esto compila con gcc versión 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; 
} 

compilado con:

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

¿Estas seguro que MiClase::enumText hace referencia a la clase correcta?

2

Dado el mensaje de error, me parece que tiene una declaración de MyClass en algún lugar (¿en otro encabezado quizás?) Que no tiene enumText [] declarado en él. El mensaje de error indica que el compilador conoce MyClass, pero no conoce el miembro enumText.

Me gustaría ver si tiene varias declaraciones de MyClass al acecho en las sombras.

¿Puede obtener wintermute's o T.E.D.'s ejemplos para compilar?

Cuestiones relacionadas