#c #inheritance #constructor #curly-braces
#c #наследование #конструктор #фигурные скобки
Вопрос:
У меня есть такой код:
class A{
public:
int b;
};
int main()
{
A a{.b = 5};
}
И программа компилируется.
Однако, когда я добавляю другой класс и создаю наследование этого класса (как показано ниже), он выдает ошибку «нет подходящей функции для вызова ‘A:: A ()’» (или «Нет подходящего конструктора для инициализации A»).
class C{
};
class A: public C{
public:
int b;
};
int main()
{
A a{.b = 5};
}
Почему?
Комментарии:
1. Изменение
class A: C{
наclass A: public C{
— aggregate инициализация требует, чтобы все наследование было общедоступным2. Программа по-прежнему не компилируется (с той же ошибкой). Я отредактировал код в своем первоначальном сообщении, чтобы добавить public (эта новая программа все еще не компилируется).
3. Какой компилятор? На некоторых не удается воспроизвести . Назначенные инициализации доступны начиная с C 20. Поэтому, пожалуйста, укажите платформу компилятора и параметры компилятора.
4. Компилируется с
-std=c 17
помощью, но нет-std=c 11
.
Ответ №1:
Вы используете функцию «Назначенные инициализаторы«, которая доступна с C 20.
Также я не могу воспроизвести эту проблему: https://godbolt.org/z/fz3PeP
- обратите внимание, что с C 17 gcc и clang просто выдают предупреждение, msvc выдает ошибку
- с C 20 это нормально для всех трех (требуется
c latest
опция msvc). - с C 14 он везде выдает ошибку
Похоже, проблема заключается только в версии или конфигурации компилятора