我有以下情况:
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&)
添加到A类,如何解决这种歧义。
我必须做到这一点的原因很复杂,但是如果这样的事情能够奏效的话会非常好。
可能有一些优先事项或类似操作员的显式关键字......任何建议都受到高度赞赏。
更新: 任何类型的强制转换都不能用于代码的第二部分。问题是找到仅修改第一个代码部分的解决方案。
更多更新: 代码#2必须按原样编译。
答案 0 :(得分: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;
}
的 Demo 强> 的
答案 1 :(得分:0)
你提出的方式使问题基本上无法解决。
有两种方法可以从A
分配给B
,但没有一种方法可供选择。
唯一的解决方案(不触及类)是明确强制转换,以便强制进行哪种转换。
一般情况下,分配和转换是多余的:如果您接受隐式转换(使用U::operator T() const
- 或 - 来自 - T::T(const U&)
),则不必提供默认值以外的分配,如果您想要隐式异构分配,则不得提供转换,或至多使它们explicit
。