質問

私はコードを書このような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または自分のコードについて教えてください。知っている静的以外のメンバーのための定数のものが定められている必要がある外部のクラスで宣言された。

役に立ちましたか?

解決

んが作り出してしまおうというものは非静員ptCreate)の静加(pts).これは動作しません。

またオプションのいずれかを使用構造体を初期化リストのパターンのクラスです。

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

または、より安全な(より良いと思)、コンストラクタのパターンを呼び出する。

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

側は、コードな作業でC++コンパイラではない紛争とVisual Studioいます。

他のヒント

できるだけ初期化することにより、構造ものの、全体として:

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

こん有効なC++.のcppファイルだけを宣言する部品の静的構造"QueryValidate::pts"が、それだけではありません。なんかを宣言するのに全体の構造はこのように:

パターンQueryValidate::pts;

したい場合はメンバで初期化する必要があり、どちらかを初期化してもう一つの方法や、追加コンストラクタのパターンと何でも引数の初期化します。

私は実際を確認しまいます。ですがこれようとしているの宣言と初期化の各分野にpts別とを宣言するptsとして単一のオブジェクトです。私は驚きVSできます。

そこで私にとって、gccは以下のようになりました。

Patterns QueryValidate::pts;

void foo () {
    QueryValidate::pts.ptCreate = "something";
    QueryValidate::pts.ptDelete = "something";
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top