У меня есть код, который неоднозначен, когда присутствует определенный конструктор. Но когда я закомментировал указанный конструктор, то компилятор жалуется, что отсутствует необходимый конструктор.
struct X;
struct E{
E(const double& r){ /* important protocol stuff */ }
E(const X&);
};
struct X{
X(){ /* important init stuff */ }
~X(){ /* important delete stuff */ }
//X(const double& r){ *this=E(r); } // POSITION 1
X(const X& x){ /* important init stuff */ *this=x; }
X(const E& e){ /* important init stuff */ *this=e; }
const X& operator=(const X& x){ return *this=E(x); }
const X& operator=(const E& e){ /* important stuff */ return *this; }
};
E::E(const X& x){ /* important protocol stuff */ }
E operator+(const E& x, const E& y){ /* important protocol stuff */ return E(1); }
E operator*(const E& x, const E& y){ /* important protocol stuff */ return E(2); }
int main(){
X x,y;
x = 3.0;
X u = 4.0; // POSITION 2
y = x + u * 5.0;
X z = 6.0 + 7.0 * y;
}
Если позиция 1 закомментирована, позиция 2 выдает ошибку.
С включенной позицией 1 возникает ошибка неоднозначности.
По сути, я хочу удалить позицию 1 и с помощью этого double->X выполнить бросок через double->E->X.
В цепочке неявных преобразований может быть только одно определяемое пользователем неявное преобразование.
Неоднозначность возникает из-за того, что (в строке x = 3.0;
) компилятор не может решить, какой из двух операторов присваивания использовать: с аргументом X&
или с аргументом E&
, поскольку оба типа параметров могут быть преобразованы из заданного double
(потому что и у E
, и у X
есть конструкторы, принимающие параметр const double&
).
Вы можете устранить эту ошибку, предоставив третий оператор присваивания, который принимает аргумент const double&
, например:
struct X {
X() { /* important init stuff */ }
~X() { /* important delete stuff */ }
X(const double& r){ *this=E(r); } // Now uncommented (required)
X(const X& x) { /* important init stuff */ *this = x; }
X(const E& e) { /* important init stuff */ *this = e; }
const X& operator=(const double& x) { return *this = E(x); } // Add this!
const X& operator=(const X& x) { return *this = E(x); }
const X& operator=(const E& e) { /* important stuff */ return *this; }
};
Пожалуйста, уточните, чем "выдает ошибку". Скопируйте и вставьте фактические сообщения об ошибках.