Разъяснение ошибки компилятора: понимание того, что «перед завершением включающего класса требуется инициализатор элемента по умолчанию»
Это сообщение об ошибке, с которым сталкиваются компиляторы GCC и Clang , сигнализирует о конкретной проблеме в коде C. Чтобы понять эту проблему, давайте проанализируем пример фрагмента кода:
class Downloader {
public:
struct Hints {
int32_t numOfMaxEasyHandles = 8;
};
static Downloader *Create(const Hints &hints = Hints());
};
При компиляции этого кода с использованием GCC и Clang (при успешной компиляции в MSVC) появляется сообщение об ошибке:
error: default member initializer for 'Downloader::Hints::numOfMaxEasyHandles' required before the end of its enclosing class
Суть этой ошибки заключается в конструкторе по умолчанию для структуры Hints. Если код закомментирован, он легко компилируется всеми тремя компиляторами. Однако раскомментирование Hints() или Hints() = default; вызывает ошибку в GCC и Clang.
Чтобы понять это поведение, важно понимать, что GCC и Clang реализуют функцию, называемую «отложенный анализ шаблонов». Эта функция откладывает синтаксический анализ и оценку определенных частей кода, таких как инициализаторы членов по умолчанию, до тех пор, пока они не будут обнаружены во время генерации кода.
В тех случаях, когда компилятор обнаруживает функцию-член, которая использует аргумент по умолчанию, включающий неинициализированный элемент данных, он может с трудом сгенерировать код, что приведет к соответствующему сообщению об ошибке. Это происходит потому, что инициализатор элемента по умолчанию должен быть проанализирован и оценен до завершения определения функции.
Эту проблему можно решить путем явной инициализации элемента данных внутри структуры, гарантируя, что он имеет значение до определения функции:
class Downloader {
public:
struct Hints {
int32_t numOfMaxEasyHandles = 8; // Explicit initialization
};
static Downloader *Create(const Hints &hints = Hints());
};
В заключение, сообщение об ошибке «инициализатор члена по умолчанию требуется до конца включающего его класса» означает, что GCC и Clang требуют, чтобы инициализатор члена по умолчанию был явно определен в объявлении структуры, особенно когда структура используется в качестве аргумента по умолчанию в функции. Обеспечивая правильную инициализацию, разработчики могут избежать этой ошибки компилятора и обеспечить плавную компиляцию в различных реализациях компилятора.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3