che*_*r89 3 c++ definition static-members visual-studio-2008
当我在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() {}
};
Run Code Online (Sandbox Code Playgroud)
然后我像这样初始化我的结构:
.cpp
string QueryValidate::pts::ptCreate = "something";
string QueryValidate::pts::ptDelete = "something";
//...
Run Code Online (Sandbox Code Playgroud)
编译器给出以下错误:
'Patterns':'::'左边的符号必须是'ptSelect'类型:不是'QueryValidate'的成员
我究竟做错了什么?这是Visual Studio或我的代码的问题吗?我知道除了const之外的静态成员必须在声明它们的类之外定义.
Pie*_*ter 10
您正在尝试创建静态成员(pts)的非静态成员(ptCreate).这不会像这样工作.
您有两个选项,要么使用Patterns类的struct初始化列表.
Patterns QueryValidate::pts = {"CREATE", "DELETE"}; // etc. for every string
Run Code Online (Sandbox Code Playgroud)
或者,更安全(在我看来更好),在Patterns中提供构造函数并调用它.
struct Patterns {
Patterns() { /*...*/ }
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
不是这样,你的代码在任何C++编译器中都不起作用,它与Visual Studio的东西没有冲突.