3

当我在 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";
//...

编译器给出以下错误:

“模式”:“::”左侧的符号必须是类型“ptSelect”:不是“QueryValidate”的成员

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

4

4 回答 4

10

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

你有两个选择,要么使用 Patterns 类的结构初始化列表。

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

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

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

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

于 2008-11-07T14:33:15.077 回答
3

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

Patterns QueryValidate::pts = { "something", "something", ... };
于 2008-11-07T14:49:06.793 回答
1

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

模式 QueryValidate::pts;

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

于 2008-11-07T14:34:50.567 回答
0

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

在 gcc 中对我有用的是:

Patterns QueryValidate::pts;

void foo () {
    QueryValidate::pts.ptCreate = "something";
    QueryValidate::pts.ptDelete = "something";
}
于 2008-11-07T15:01:29.140 回答