C Нет соответствующего конструктора при использовании наследования

#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 он везде выдает ошибку

Похоже, проблема заключается только в версии или конфигурации компилятора