У меня следующая ситуация:
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 ДОЛЖНА компилироваться как есть.
Это похоже на работу для полиморфизма:
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;
}
То, как вы изложили, делает проблему практически неразрешимой.
Очевидно, есть два способа присвоения A
из B
ни один из которых не является предпочтительным.
Единственное решение (не касаясь классов) — явное приведение, чтобы вы принудительно указали, какое преобразование должно произойти.
В общем случае присваивание и преобразование являются избыточными: если вы допускаете неявное преобразование (либо в — с U::operator T() const
— или из — с T::T(const U&)
) вам не нужно предоставлять назначение, отличное от значения по умолчанию, и если вы хотите неявные гетерогенные назначения, вы не должны предоставлять преобразование или, в большинстве случаев, делать их explicit
,