operator =与转换运算符结合的歧义

时间:2013-02-11 18:21:26

标签: c++ visual-c++ operator-overloading ambiguity

我有以下情况:



    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必须按原样编译。

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