2009-09-03 16 views
12

Non riesco, per la vita di me, a capire come farlo correttamente. Ho una classe che ha bisogno di memorizzare alcune costanti (testo che corrisponde a valori in un tipo enum) - l'ho dichiarato come questo (pubblicamente) nella mia classe:Inizializzazione dell'array statico di stringhe (C++)?

const static char* enumText[]; 

E io sto cercando di inizializzarlo in questo modo:

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

Tuttavia gcc mi dà il seguente errore:

'const char * MiaClasse :: enumText []' non è un membro statico di 'class MyClass'

Cosa am Sto sbagliando? Grazie!

+0

Provare: static const char * enumText []; in classe? –

+0

Sospetto fortemente che questa sia una vecchia versione g ++ che tratta in modo errato 'const static char * []' lì come 'static char * [] const' piuttosto che' static const char * [] '(perché' static' sta in un posto "insolito"). –

+0

Potresti incollare un pezzo di codice completo e compilabile nella tua risposta che mostri il problema? – sbi

risposta

13

Questo codice viene compilato:

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

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

controllare il codice e trovare le differenze. Posso solo pensare che non hai definito l'attributo statico nella classe, hai dimenticato di includere l'intestazione o hai sbagliato a digitare il nome.

+9

La riga 5 dovrebbe avere 'X :: enumtext' oppure si sta semplicemente creando una nuova variabile. –

+0

Quello era un errore nella risposta, l'ho corretto. Ad ogni modo, il codice si compila con gcc (sia 4.0 in MacOSX che 4.3 in ubuntu) –

+0

Wooo Mi sento stupido, ho avuto un errore di battitura che non ho notato .. –

1

Come dice il compilatore, si sta tentando di definire un memeber statico di MyClass che sarebbe un array const char * denominato enumText. Se non si ha la dichiarazione nella classe, allora c'è un problema.

Si dovrebbe avere:

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

o forse si vuole did'nt un membro statico. Altrimenti, non dovresti usare una classe nel nome.

In ogni caso, ciò non ha nulla a che fare con l'intializzazione dell'array.

+0

Op dice "L'ho dichiarato in questo modo (pubblicamente) nella mia classe" – snarf

+0

@Snarfblam: ma spesso quello che un OP dice e la realtà sono 2 cose diverse - specialmente dal momento che quello che dice che ha fatto dovrebbe funzionare. –

1

Il seguente codice compila bene per me in VS 2005:

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

Se dovessi prendere un ipotesi, direi che la linea initilization è in un file sorgente separato, e si dimenticato per # include il file .h che contiene MyClass. Questo è esattamente il genere di cose che faccio a pezzi e faccio tutto il tempo.

Inoltre, sembra molto probabile che tu abbia il const nel punto sbagliato (o non abbastanza). Il modo in cui lo hai ora, non è la matrice che è costante, o i puntatori nella matrice; solo gli elementi del personaggio al suo interno.

6

Questo compila con gcc 4.0.1 versione:

#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; 
} 

compilato con:

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

Sei sicuro che MyClass::enumText fa riferimento la classe giusta?

2

Dato il messaggio di errore, mi sembra di avere una dichiarazione di MyClass da qualche parte (in un'altra intestazione, forse?) Che non ha enumText [] dichiarato in esso. Il messaggio di errore indica che il compilatore conosce circa MyClass, ma non conosce il membro enumText.

Mi piacerebbe vedere se ci sono più dichiarazioni di MyClass in agguato nell'ombra.

È possibile ottenere gli esempi wintermute's o T.E.D.'s da compilare?

Problemi correlati