Строка 15
Ваши конструкторы ссылок принимают только ссылки на не const
объекты.
То есть вы написали:
A(int) { cout<<"A::A(int)"<<endl; }
A(double&) { cout<<"A::A(double&)"<<endl; }
A(B&) { cout<<"A::A(B&)"<<endl; }
вместо:
A(int) { cout<<"A::A(int)"<<endl; }
A(double const&) { cout<<"A::A(double const&)"<<endl; }
A(B const&) { cout<<"A::A(B const&)"<<endl; }
Проблема в том, что в A obj((double)2.1)
вы вызывали конструкторы с временными объектами (в этом случае двойной литерал 2.1
(приведение к double
бессмысленно), и временные объекты могут не связываться со ссылками, которые не являются ссылками на const
.
Так что конструктор A(double&)
не может быть вызван; единственное, что может совпадать, это A(int)
, и для ваших данных выполняется необходимое преобразование (2.1
& rarr; 2
). (Ваш компилятор обычно предупредит вас , что это происходит.)
Итак, используйте форму конструктора, которая принимает ссылку на const
.
Строка 18
Что касается вашего A obj4(B)
, B
- это тип, поэтому вы объявляете функцию с именем obj4
, которая принимает (без имени) B
и возвращает A
.