Por que eu não posso usar membros estáticos, destinados a estruturas exemplo estáticos, em minhas aulas no VS2008?

StackOverflow https://stackoverflow.com/questions/272161

Pergunta

Quando eu escrever um código como este no 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() {}
};

Em seguida, inicializar o meu estrutura como esta:

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

O compilador dá os seguintes erros:

'padrões': O símbolo à esquerda de um '::' deve ser um tipo 'ptSelect' : Não é um membro de 'QueryValidate'

O que estou fazendo de errado? É este um problema com Visual Studio ou com o meu código? Eu sei que os membros estáticos, exceto para aqueles const deve ser definido fora da classe que foram declarados no.

Foi útil?

Solução

Você está tentando criar um membro não-estático (ptCreate) de um membro estática (pts). Isso não vai funcionar assim.

Você tem duas opções, ou usar um struct initializer lista para a classe padrões.

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

Ou, muito mais seguro (e melhor na minha opinião), fornecer um construtor em padrões e chamada que um.

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

Em um lado não, seu código não funcionaria em qualquer compilador C ++, não é um conflito com o Visual Studio coisas.

Outras dicas

Você só pode inicializar a estrutura como um todo, como em:

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

Este não é válido C ++. No arquivo CPP você está declarando partes da estrutura estática "QueryValidate :: pts", mas isso não é permitido: você tem de declarar toda a estrutura, assim:

Patterns QueryValidate :: pts;

Se você quer que os membros de ser inicializado, você quer inicializar-los em outro método, ou adicionar um construtor para Padrões que toma o que quer argumentos de inicialização que você deseja.

Eu não estou realmente certo o que você está tentando fazer aqui. Parece tipo de como você está tentando declarar e inicializar cada campo no pts separadamente, ao invés de pts de declaração de uma vez como um único objeto. Estou realmente surpreso VS permite que você faça isso.

O que funcionou para mim no gcc foi o seguinte:

Patterns QueryValidate::pts;

void foo () {
    QueryValidate::pts.ptCreate = "something";
    QueryValidate::pts.ptDelete = "something";
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top