оператор = неоднозначность в сочетании с операторами преобразования

У меня следующая ситуация:



class B;

class A {
private:
int n;
public:
A& operator=(const A& a) {
}

A& operator=(const int n) {
this->n = n;
}

friend class B;
};

class B {
private:
A a;
public:
operator A&() {
return a;
}

operator int&() {
return a.n;
}
};

Когда я выполняю этот код:



A a;
B b;
int i = b;
a = b;
a = i;

У меня есть следующая ошибка:



error C2593: 'operator =' is ambiguous
..\CrossPPTest\TestProxy.cpp(40): could be 'A &A::operator =(const int)'
..\CrossPPTest\TestProxy.cpp(37): or       'A &A::operator =(const A &)'
while trying to match the argument list '(A, B)'

Как решить эту двусмысленность, если не могу добавить

A& operator =(const B&)[/ NOEDIT]

в класс А.

Есть сложные причины, почему я должен делать именно так, но было бы очень хорошо, если бы такая вещь работала.

Может быть, есть какие-то приоритеты или что-то вроде явного ключевого слова для операторов … Любые предложения очень ценятся.

ОБНОВИТЬ:
Любые виды приведений не могут быть использованы во второй части кода. Дело в том, чтобы найти решение, модифицирующее только первую часть кода.

ОДНО БОЛЬШЕ ОБНОВЛЕНИЯ:
Часть кода 2 ДОЛЖНА компилироваться как есть.

0

Решение

Это похоже на работу для полиморфизма:

class B;

class A {
int n;
public:
A& operator=(const A& a) {...}

A& operator=(const int n) {
this->n = n;
return *this;
}

friend class B;
};

class B : public A {
A a;
public:
operator int&() {
return a.n;
}
};

int main() {
A a;
B b;
int i = b; // works
a = b; // works
a = i;
}

демонстрация

0

Другие решения

То, как вы изложили, делает проблему практически неразрешимой.

Очевидно, есть два способа присвоения A из Bни один из которых не является предпочтительным.

Единственное решение (не касаясь классов) — явное приведение, чтобы вы принудительно указали, какое преобразование должно произойти.

В общем случае присваивание и преобразование являются избыточными: если вы допускаете неявное преобразование (либо в — с U::operator T() const — или из — с T::T(const U&) ) вам не нужно предоставлять назначение, отличное от значения по умолчанию, и если вы хотите неявные гетерогенные назначения, вы не должны предоставлять преобразование или, в большинстве случаев, делать их explicit,

0