Почему компилятор выдает «ожидается спецификатор типа»? - PullRequest
2 голосов
/ 20 марта 2020
class A
{
private:
   int a;

public:
   int get_a()
   {
      return a;
   }
   A(int mode)
   {
      a = 0;
   }
   A()
   {
      a = 5;
   }
};

class B
{
public:
   A b(0);   
};

class C
{
   int c;

public:
   C(int mode)
   {
      c = 0;
   }
   C()
   {
      c = 1;
   }
};

int main()
{
   B bb;
   C cc(0);
   //cout << bb.b.get_a();
   system("pause");
   return 0;
}

, если я использую скобки () на b в классе B, выдает ошибку, если я переключаюсь на {}, все в порядке. Мой вопрос: нельзя ли мне это разрешить, так как на cc в основном это не дает никакой ошибки. И им разрешено использовать скобки () при инициализации объектов.

1 Ответ

5 голосов
/ 20 марта 2020

В соответствии со Стандартом C ++ 20 (11.4 членов класса) вы можете использовать инициализатор скобок или равно для инициализации члена данных класса

member-declarator:
    ...
    declarator brace-or-equal-initializeropt

Таким образом, вы можете использовать либо

class B
{
public:
   A b = 0;   
};

или

class B
{
public:
   A b { 0 };   
};

Это позволяет избежать двусмысленности при объявлении функции.

...