2008-11-07 32 views
3

當我在VS 2008中這樣寫代碼:

爲什麼我不能在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或我的代碼問題嗎?我知道靜態成員除了常量之外,必須在它們聲明的類之外定義。

+0

哎呀 - 對不起,去除一些代碼示例。感謝您修復Rich B. – 2008-11-07 16:52:18

回答

10

您試圖創建靜態成員(pts)的非靜態成員(ptCreate)。這不會像這樣工作。

您有兩個選項,可以使用Patterns類的struct initializer列表。或者,更安全(在我看來更好),在模式中提供一個構造函數並調用它。

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

在一個側面沒有,你的代碼將不會在任何C++編譯器的工作,它不與Visual Studio的東西發生衝突。

1

這是無效的C++。在cpp文件中,您聲明瞭靜態結構的一部分「QueryValidate :: pts」,但這不是允許的:您必須聲明整個結構,如下所示:

模式QueryValidate :: pts;

如果您希望成員初始化,您可以用另一種方法初始化它們,或者將模板的構造函數添加到需要任何初始化參數的模式中。

+0

'聲明'和'定義'之間有一個重要的區別。這傢伙正在定義靜態結構的一部分。除此之外,你當然是對的。 – xtofl 2008-11-07 14:55:23

3

只能初始化結構作爲一個整體,如:

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

我並不真正知道什麼你想在這裏做。它看起來有點像你試圖單獨聲明和初始化每個字段中的每個字段,而不是將pts單獨聲明爲單個對象。我真的很驚訝VS可以讓你做到這一點。

什麼gcc的工作對我來說是如下:

Patterns QueryValidate::pts; 

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