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

Why can't I use static members, for example static structures, in my classes in VS2008?

本文关键字:静态成员 静态 结构 不能 VS2008 为什么      更新时间:2023-10-16

当我在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成员除外)必须在声明它们的类之外定义。

您正试图创建一个静态成员(pts)的非静态成员(ptCreate)。这样不行。

您有两个选项,要么为Patterns类使用结构初始值设定项列表。

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

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

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

从另一方面来说,你的代码在任何C++编译器中都无法工作,这与Visual Studio的东西没有冲突。

您只能将结构作为一个整体进行初始化,如:

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

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

Patterns QueryValidate::pts;

如果希望对成员进行初始化,可以在另一个方法中对其进行初始化,也可以向Patterns添加一个构造函数,该构造函数接受所需的任何初始化参数。

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

在gcc对我有效的是:

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