С++ для начинающих



     патока |     

.Неоднозначность - часть 2


Таким образом, первая устоявшая функция лучше для левого операнда, а вторая– для правого. Поскольку наилучшей функции не существует, то вызов помечается компилятором как неоднозначный.

При проектировании интерфейса класса, включающего объявление перегруженных операторов, конструкторов и конвертеров, следует быть весьма аккуратным. Определенные пользователем преобразования применяются компилятором неявно. Это может привести к тому, что встроенные операторы окажутся устоявшими при разрешении перегрузки для операторов с операндами типа класса.

Упражнение 15.17

Назовите пять множеств функций-кандидатов, рассматриваемых при разрешении перегрузки оператора с операндами типа класса.

Упражнение 15.18

Какой из операторов operator+() будет выбран в качестве наилучшего из устоявших для оператора сложения в main()? Перечислите все функции-кандидаты, все устоявшие функции и преобразования типов, которые надо применить к аргументам для каждой устоявшей функции.

namespace NS {

   class complex {

      complex( double );

      // ...

   };

   class LongDouble {

      friend LongDouble operator+( LongDouble &, int ) { /* ... */ }

   public:

      LongDouble( int );

      operator double();

      LongDouble operator+( const complex & );

      // ...

   };

   LongDouble operator+( const LongDouble &, double );

}

int main() {

   NS::LongDouble ld(16.08);

   double res = ld + 15.05;   // какой operator+?

   return 0;

}




Содержание  Назад  Вперед