Domanda

Quando scrivo codice come questo in VS 2008:

.h
struct Patterns {
        string ptCreate;
        string ptDelete;
        string ptDrop;
        string ptUpdate;
        string ptInsert;
        string ptSelect;
    };     

class QueryValidate {
    string query;
    string pattern;
    static Patterns pts;
public:
    friend class Query;
    QueryValidate(const string& qr, const string& ptn):
      query(qr), pattern(ptn) {}
    bool validate() {
        boost::regex rg(pattern);
        return boost::regex_match(query, rg);
    }
    virtual ~QueryValidate() {}
};

Quindi inizializzo la mia struttura in questo modo:

.cpp
string QueryValidate::pts::ptCreate = "something";
string QueryValidate::pts::ptDelete = "something";
//...

Il compilatore fornisce i seguenti errori:

  

'Patterns': il simbolo a sinistra di un '::' deve essere un tipo 'ptSelect'   : non è un membro di "QueryValidate"

Cosa sto facendo di sbagliato? È un problema con Visual Studio o con il mio codice? So che i membri statici tranne quelli const devono essere definiti al di fuori della classe in cui sono stati dichiarati.

È stato utile?

Soluzione

Stai provando a creare un membro non statico (ptCreate) di un membro statico (pts). Questo non funzionerà in questo modo.

Hai due opzioni, o usa un elenco di inizializzatori struct per la classe Patterns.

Patterns QueryValidate::pts = {"CREATE", "DELETE"}; // etc. for every string

O, molto più sicuro (e meglio secondo me), fornire un costruttore in Patterns e chiamarlo così.

struct Patterns {
   Patterns() { /*...*/ }
   /* ... */
}

Da un lato no, il tuo codice non funzionerebbe in nessun compilatore C ++, non è un conflitto con le cose di Visual Studio.

Altri suggerimenti

Puoi inizializzare solo la struttura nel suo insieme, come in:

Patterns QueryValidate::pts = { "something", "something", ... };

Questo non è C ++ valido. Nel file cpp stai dichiarando parti della struttura statica " QueryValidate :: pts " ;, ma non è permesso: devi dichiarare l'intera struttura, in questo modo:

Patterns QueryValidate :: pts;

se si desidera inizializzare i membri, è possibile inizializzarli in un altro metodo o aggiungere un costruttore a Pattern che accetta qualsiasi argomento di inizializzazione desiderato.

Non sono sicuro di cosa stai cercando di fare qui. Sembra un po 'come se stessi cercando di dichiarare e inizializzare ogni campo in pts separatamente, piuttosto che dichiarare pts una volta come un singolo oggetto. Sono davvero sorpreso che VS ti permetta di farlo.

Ciò che ha funzionato per me in gcc è stato il seguente:

Patterns QueryValidate::pts;

void foo () {
    QueryValidate::pts.ptCreate = "something";
    QueryValidate::pts.ptDelete = "something";
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top