Почему я получаю ошибку: «существует более одного конструктора по умолчанию»? - PullRequest
0 голосов
/ 11 мая 2019

Я получаю сообщение:

Код серьезности Описание Ошибка состояния подавления строки файла проекта (активная) E0339 класс "D" имеет более одного конструктора по умолчанию)

и:

Код серьезности Описание Ошибка состояния подавления строки файла проекта C2668 'D :: D': неоднозначный вызов перегруженной функции)

Ошибка возникает в строке, отмеченной// (2)

если я удалю строку, помеченную // (1), я смогу построить свой код.

class C {
    int i, j;

public:
    C(int x, int y) : i(x), j(y)
    {
        cout << "Konstr C" << endl;
    }
    C() : i(0), j(0)
    {
        cout << "Std-Konstr C" << endl;
    }
        ~C()
    {
        cout << "Destruktor C" << endl;
    }
};
class D : public C {
    int k, a, b;
    C c;
public:

    D():c(){ cout << "Std-Konstr D" << endl; }// (1)

    D(int x = 1) :c(x, 1), a(x), b(0), k(19)

    {
        cout << "Konstr-1 D" << endl;
    }
    D(int x, int y, int z) :C(x, y), a(1), b(2), c(x, y), k(z)
    {
        cout << "Konstr-2 D" << endl;
    }
    ~D()
    {
        cout << "Destruktor D" << endl;
    }
};
class E : public D {
    int m;
    C c;
    D b;
public:
    E(int x, int y) : c(2, 3), b(y), m(x + y)// (2)
    {
        cout << "Konstr E" << endl;
    }
    ~E()
    {
        cout << "Destruktor E" << endl;
    }
};

1 Ответ

1 голос
/ 11 мая 2019

Как говорится в сообщении об ошибке, D() неоднозначно. Компилятор не может знать, хотите ли вы вызвать конструктор no-arg или конструктор int со значением по умолчанию 1.

Одним из способов устранения этой неоднозначности является удаление значения по умолчанию для параметра x:

D():c(){ cout << "Std-Konstr D" << endl; }// (1)

D(int x) :c(x, 1), a(x), b(0), k(19)
//    ^-- x=1 was removed here
{
    cout << "Konstr-1 D" << endl;
}
...