2013-02-11 3 views
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 ДОЛЖЕН компилироваться как есть.

+0

Используйте явное литье. –

+0

@SethCarnegie Я знаю о явных приведениях, но спасибо. Причина, по которой я не могу ее использовать, заключается в том, что вторая часть кода будет написана другими разработчиками, и я хочу сделать ее максимально простой. – strannik

+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

+0

Прочтите комментарии к вопросу. Неуместный. – strannik

+0

@ Daniel Посмотрите обновления. Это работает для вас? – 0x499602D2

0

как вы позировала делает проблему по существу неразрешима.

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

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

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

Смежные вопросы