0

次のような状況があります。



    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 番目の部分では、どのような種類のキャストも使用できません。問題は、最初のコード部分のみを変更する解決策を見つけることです。

もう 1 つの更新: コード部分 #2 はそのままコンパイルする必要があります。

4

2 に答える 2

0

あなたが提起した方法では、問題は実質的に解決できなくなります。

Afrom aに を代入する方法は明らかに 2 つありますがB、どちらも好ましくありません。

唯一の解決策 (クラスに触れずに) は、明示的にキャストすることです。これにより、どの変換を行う必要があるかを強制できます。

U::operator T() const一般に、代入と変換は冗長です: 暗黙の変換 ( to - with - または from - with のいずれか)を認める場合T::T(const U&)は、デフォルト以外の代入を提供する必要はありません。暗黙の異種代入が必要な場合は、提供してはなりません。変換、またはせいぜいそれらを作るexplicit

于 2013-02-11T19:55:21.903 に答える
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;
}

デモ

于 2013-02-11T18:26:28.217 に答える