Mir*_*pas 6 c++ visual-c++-2008 visual-c++
我有这个代码
typedef struct
{
const char* fooString;
const bool fooBool;
}fooStruct;
Run Code Online (Sandbox Code Playgroud)
而这个初始化程序:
static const fooStruct foo[] =
{
{"file1", true},
{"file2", false},
....
};
Run Code Online (Sandbox Code Playgroud)
使用此代码,我在VS2008中有3个警告:
error C2220: warning treated as error - no 'object' file generated
warning C4510: '<unnamed-tag>' : default constructor could not be generated
warning C4512: '<unnamed-tag>' : assignment operator could not be generated
warning C4610: struct '<unnamed-tag>' can never be instantiated - user defined constructor required
Run Code Online (Sandbox Code Playgroud)
Ada*_*eld 11
这正是编译器所说的:它不能为你的struct生成一个默认的构造函数或赋值运算符,因为它有一个const成员(const bool fooBool).const无法初始化作为引用或引用的struct成员,因此必须在用户编写的构造函数或赋值运算符中显式初始化它们.
一种解决方案是编写自己的默认构造函数和赋值运算符(并且根据三的规则,您还应该编写一个复制构造函数;析构函数不是绝对必要的,但是很好的做法).替代的,更容易的解决方案就是制造fooBool非const.然后,编译器将很乐意为您生成默认构造函数和赋值运算符.
由于您已经创建了const这些实例的数组static const fooStruct foo[] = ...,因此额外const开启fooBool是没有意义的.
C4610警告不正确.这是Visual C++中的已知错误.请参阅Microsoft Connect错误"C4610的不正确发布".
Adam Rosenfield解释了为什么会发出其他两个警告(C4510和C4512).
| 归档时间: |
|
| 查看次数: |
3172 次 |
| 最近记录: |