Почему я получаю эти предупреждения в Visual C++ 2008 при создании структуры?
у меня есть этот код
typedef struct
{
const char* fooString;
const bool fooBool;
}fooStruct;
и этот инициализатор:
static const fooStruct foo[] =
{
{"file1", true},
{"file2", false},
....
};
С этим кодом у меня есть 3 предупреждения в 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
3 ответов
предупреждение C4610 неверно. Это известная ошибка в Visual C++. См. ошибку Microsoft Connect " неправильная выдача C4610."
Адам Розенфельд объясняет почему испускаются два других предупреждения (C4510 и C4512).
это именно то, что говорит компилятор: он не может генерировать конструктор по умолчанию или оператор присваивания для вашей структуры, потому что у него есть const
член в ее (const bool fooBool
). члены структуры, которые являются const
или которые являются ссылками, не могут быть инициализированы по умолчанию, поэтому они должны быть явно инициализированы в написанном пользователем конструкторе или операторе присваивания.
выход один-написать свой собственный конструктор по умолчанию и оператор присваивания (и в соответствии с правила три, вы также должны написать конструктор копирования; деструктор не является строго необходимым, но это хорошая практика). Альтернативное, более простое решение - просто сделать fooBool
неconst
. Затем компилятор с радостью создаст для вас конструктор по умолчанию и оператор присваивания.
поскольку вы уже создаете массив const
экземпляры этих с static const fooStruct foo[] = ...
лишние const
on fooBool
- это бессмысленно.
также, если вы выполните частичную инициализацию, MSVC2008 выдаст ошибки (как и MSVC2010), что является неправильным поведением, определенным C++03 и C++11. Я опубликовал больше об этом в другом потоке в Stack overflow, который вы можете прочитать здесь
// Partial initialization, leaving it to the compiler
// to do aggregate value-initialization
fooStruct foo ={"file1", /*missing true/false, compiler should set false*/ };
MSVC выдаст ошибку в этом коде вместе с предупреждениями, которые вы упомянули.