2008-11-07 14 views
3

Когда я пишу код, как это в VS 2008:

Почему я не могу использовать статические элементы, например статические структуры, в своих классах в VS2008?

.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() {} 
}; 

Я тогда инициализировать свою структуру, как это:

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

Компилятор дает следующие ошибки:

' Шаблоны: символ слева от «::» должен быть типом «ptSelect» : не является членом «QueryValidate»

Что я делаю неправильно? Это проблема с Visual Studio или с моим кодом? Я знаю, что статические члены, за исключением const, должны быть определены вне класса, в котором они были объявлены.

+0

К сожалению, - извините за удаление некоторых из примера кода. Спасибо за исправление Rich B. – 2008-11-07 16:52:18

ответ

10

Вы пытаетесь создать нестатический элемент (ptCreate) статического члена (pts). Это не будет работать так.

У вас есть два варианта: либо используйте список инициализаторов структуры для класса Patterns.

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

Или, намного безопаснее (и лучше на мой взгляд), обеспечивают конструктор в Patterns и называют эту.

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

На стороне нет, ваш код не будет работать в любой компилятор C++, это не конфликт с Visual Studio вещей.

1

Это недопустимо C++. В файле cpp вы объявляете части статической структуры «QueryValidate :: pts», но это недопустимо: вы должны объявить всю структуру, например:

Шаблоны QueryValidate :: pts;

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

+0

Существует важное различие между «объявлением» и «определением». Парень определяет часть статической структуры. Кроме того, вы правы, конечно. – xtofl 2008-11-07 14:55:23

3

можно только инициализировать структуру в целом, как в:

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

Я не очень уверен, что вы пытаетесь сделать здесь. Это похоже на то, что вы пытаетесь объявить и инициализировать каждое поле в pts отдельно, а не объявлять pts один раз как один объект. Я действительно удивлен, что VS позволяет вам это сделать.

То, что работало для меня в НКУ было следующее:

Patterns QueryValidate::pts; 

void foo() { 
    QueryValidate::pts.ptCreate = "something"; 
    QueryValidate::pts.ptDelete = "something"; 
}