为什么我不能在VS2008的类中使用静态成员,例如静态结构?

时间:2008-11-07 14:09:38

标签: c++ visual-studio-2008 definition static-members

当我在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() {}
};
然后我按照这样初始化我的结构:

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

编译器出现以下错误:

  

'Patterns':'::'左边的符号必须是'ptSelect'类型   :不是'QueryValidate'的成员

我做错了什么?这是Visual Studio或我的代码的问题吗?我知道除了const之外的静态成员必须在声明它们的类之外定义。

4 个答案:

答案 0 :(得分:10)

您正在尝试创建静态成员(pts)的非静态成员(ptCreate)。这不会像这样工作。

你有两个选择,要么为Patterns类使用struct初始化列表。

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

或者,更安全(在我看来更好),在Patterns中提供构造函数并调用它。

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

另一方面,你的代码在任何C ++编译器中都不起作用,它与Visual Studio的东西没有冲突。

答案 1 :(得分:3)

您只能初始化整个结构,如:

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

答案 2 :(得分:1)

这不是有效的C ++。在cpp文件中,你声明静态结构的一部分“QueryValidate :: pts”,但这是不允许的:你必须声明整个结构,如下所示:

模式QueryValidate :: pts;

如果你想要初始化成员,你可以在另一个方法中初始化它们,或者在一个带有你想要的任何初始化参数的模式中添加一个构造函数。

答案 3 :(得分:0)

我不确定你在这里要做什么。看起来有点像你试图分别声明和初始化pts中的每个字段,而不是将pts声明为一个单独的对象。我真的很惊讶VS让你这样做。

在gcc中对我有用的是:

Patterns QueryValidate::pts;

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