6

我有这个代码

typedef struct
{
    const char* fooString;
    const bool  fooBool;
}fooStruct;

这个初始化器:

static const fooStruct foo[] =
{
    {"file1", true},
    {"file2", false},
    ....
};

使用此代码,我在 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 
4

3 回答 3

11

这正是编译器所说的:它不能为你的结构生成默认构造函数或赋值运算符,因为它有一个const成员(const bool fooBool)。属于或属于引用的结构成员const不能默认初始化,因此必须在用户编写的构造函数或赋值运算符中显式初始化它们。

一种解决方案是编写自己的默认构造函数和赋值运算符(根据三的规则,您还应该编写一个复制构造函数;析构函数不是绝对必要的,但它是一种很好的做法)。另一种更简单的解决方案是使fooBoolconst. 然后,编译器会很乐意为您生成默认构造函数和赋值运算符。

由于您已经使用 创建了const这些实例的数组static const fooStruct foo[] = ...,因此额外的constonfooBool毫无意义。

于 2011-08-22T17:50:08.947 回答
8

C4610 警告不正确。这是 Visual C++ 中的一个已知错误。请参阅 Microsoft Connect 错误“C4610 发布不当”。

Adam Rosenfield 解释了为什么会发出另外两个警告(C4510 和 C4512)。

于 2011-08-22T17:51:33.090 回答
0

此外,如果您进行部分初始化,则 MSVC2008 将抛出错误(与 MSVC2010 一样),这是 C++03 和 C++11 定义的错误行为。我在另一个关于堆栈溢出的线程中发布了更多关于此的内容,您可以在此处阅读

// Partial initialization, leaving it to the compiler
// to do aggregate value-initialization
fooStruct foo ={"file1", /*missing true/false, compiler should set false*/ };

MSVC 将在此代码上引发错误以及您提到的警告。

于 2012-01-06T04:28:58.907 回答