为什么我不能在VS2008的类中使用静态成员,例如静态结构?
Why can't I use static members, for example static structures, in my classes in VS2008?
当我在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成员除外)必须在声明它们的类之外定义。
您正试图创建一个静态成员(pts)的非静态成员(ptCreate)。这样不行。
您有两个选项,要么为Patterns类使用结构初始值设定项列表。
Patterns QueryValidate::pts = {"CREATE", "DELETE"}; // etc. for every string
或者,更安全(在我看来更好)的是,在Patterns中提供一个构造函数并调用它。
struct Patterns {
Patterns() { /*...*/ }
/* ... */
}
从另一方面来说,你的代码在任何C++编译器中都无法工作,这与Visual Studio的东西没有冲突。
您只能将结构作为一个整体进行初始化,如:
Patterns QueryValidate::pts = { "something", "something", ... };
这不是有效的C++。在cpp文件中,您声明了静态结构的一部分"QueryValidate::pts",但这是不允许的:您必须声明整个结构,如下所示:
Patterns QueryValidate::pts;
如果希望对成员进行初始化,可以在另一个方法中对其进行初始化,也可以向Patterns添加一个构造函数,该构造函数接受所需的任何初始化参数。
我真的不确定你在这里想做什么。看起来有点像是试图分别声明和初始化pts中的每个字段,而不是将pts作为单个对象声明一次。我真的很惊讶VS让你这么做。
在gcc对我有效的是:
Patterns QueryValidate::pts;
void foo () {
QueryValidate::pts.ptCreate = "something";
QueryValidate::pts.ptDelete = "something";
}
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 如何在C++中使用非静态成员函数作为回调函数
- (C++)为什么静态成员可以在初始化之前使用
- 类的全局对象和静态成员
- 在作为静态成员包含在另一个类中的类的构造函数中使用 cout
- 模板化类中静态成员的延迟初始化
- 使用静态成员声明类时遇到问题
- C++:是否可以使用非静态成员变量模板?
- 静态成员函数使用相同的名称时出现模板类型名称错误
- 如何在复杂继承中访问静态成员变量
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 如何在友元函数中使用静态成员而不添加前缀 [类名]::
- C++构造函数和静态成员
- 为什么传递非静态成员函数会导致编译错误?
- 非静态成员失败的线程调用函数
- 静态成员变量不会由 gettext 转换
- decltype:使用指针访问类的静态成员
- 处理类内的回调时,必须调用对非静态成员函数的引用
- 非静态成员函数的 decltype 格式不正确吗?
- 初始化与类类型相同的静态成员(静态初始化顺序问题)