Почему gcc требует public для A::A(), ведь в данном примере A::A() не используется вообще?
$ cat opyt.cpp
#include <iostream>
using namespace std;
class A
{
public:
A( int i ) { cout << "A::A( int )" << endl; }
private:
A() { cout << "A::A()" << endl; }
};
class B
{
public:
A a;
B( int i ) : a(i) {}
private:
B(){}
};
int main()
{
B b(1);
return 0;
}
$ g++ -g opyt.cpp
opyt.cpp: In constructor 'B::B()':
opyt.cpp:20: error: 'A::A()' is private
opyt.cpp:30: error: within this context
P.S. Почему после неудачного добавления сообщения "Preformatet text" перескакивает на "TeX paragraph"?
Но при инстанировании класса B используется конструктор с параметром в котором также указано что при инстанировании A нужно использовать конструктор с параметром который кстати public.
> Но при инстанировании класса B используется конструктор с параметром в котором также указано что при инстанировании A нужно использовать конструктор с параметром который кстати public.
Ошибаетесь, конструктор с параметром A(int) доступен всем, стало понятно что в данном случае компилятор ругается на декларацию в которой мог бы быть использован конструктор по умолчанию A() который private, но почему он не ругается на приватный конструктор B() который тоже мог бы быть использован остается загадкой.
Получается что компилятор встретив дифиницию B::B() задумывает сгенерировать код типа call A::A(), но тут бац видит что A::A() недоступен в данном контексте и генерирует ошибку, но зачем он генерирует код для B::B()? Всетаки g++ суров.
Потому чта это его священный долг - самому слепить конструктор без параметров, ежели никакой пользовательский конструктор в этом какчестве использовать низзя. А тута ты его еще об этом и специяльно попросил, определив такой конструктор.