Why do I get these warnings in Visual C++ 2008 when building a struct?

自古美人都是妖i 提交于 2019-12-01 17:00:19

问题


I have this code

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

And this initializer:

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

With this code I have 3 warnings in VS2008:

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 

回答1:


The C4610 warning is incorrect. This is a known bug in Visual C++. See the Microsoft Connect bug "Improper issuance of C4610."

Adam Rosenfield explains why the other two warnings (C4510 and C4512) are emitted.




回答2:


It's exactly what the compiler says: it can't generate a default constructor or assignment operator for your struct because it has a const member in it (const bool fooBool). struct members which are const or which are references cannot be default-initialized, so they must be explicitly initialized in a user-written constructor or assignment operator.

One solution is to write your own default constructor and assignment operator (and in line with the rule of three, you should also write a copy constructor; a destructor isn't strictly necessary but is good practice). The alternative, easier solution is just to make fooBool non-const. Then, the compiler will happily generate the default constructor and assignment operator for you.

Since you're already creating an array of const instances of these with static const fooStruct foo[] = ..., the extra const on fooBool is pointless.




回答3:


Also if you do partial initialization then MSVC2008 will throw errors (as does MSVC2010) which is incorrect behavior as defined by C++03 and C++11. I posted more on this in another thread on stack overflow which you can read here

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

MSVC will throw an error on this code along with the warnings you mentioned.



来源:https://stackoverflow.com/questions/7151298/why-do-i-get-these-warnings-in-visual-c-2008-when-building-a-struct

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!