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

コンパイラは次のエラーを返します。

'Patterns': '::' の左側の記号は型でなければなりません 'ptSelect' : 'QueryValidate' のメンバーではありません

私は何を間違っていますか?これは Visual Studio または私のコードの問題ですか? const 以外の静的メンバーは、宣言されたクラスの外部で定義する必要があることを知っています。

4

4 に答える 4

10

静的メンバー (pts) の非静的メンバー (ptCreate) を作成しようとしています。これはこのようには機能しません。

パターン クラスの構造体初期化子リストを使用するかの 2 つのオプションがあります。

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

または、はるかに安全 (そして私の意見ではより良い)、パターンでコンストラクターを提供し、それを呼び出します。

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 を 1 つのオブジェクトとして 1 回宣言するのではなく、pts の各フィールドを個別に宣言して初期化しようとしているように見えます。VSでそれができることに本当に驚いています。

gccで私にとってうまくいったのは次のとおりです。

Patterns QueryValidate::pts;

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