Почему наследование перегрузки константной / неконстантной функции неоднозначно? - PullRequest
0 голосов
/ 18 января 2019

Я пытался создать два класса, первый с неконстантной реализацией функций, второй с константной реализацией. Вот небольшой пример:

class Base {
protected:
  int some;
};

class A : public virtual Base {
  const int& get() const {
    return some;
  }
};

class B : public virtual Base {
  int& get() {
    return some;
  }
};

class C : public A, B {};

C test;
test.get(); // ambiguous 

Вызов функции get неоднозначен. Неважно, что версия const должна соответствовать большему количеству требований. (Вызов get для const C также неоднозначен, но есть одна возможная функция для вызова.) Есть ли причина для такого поведения в стандарте? Спасибо!

Ответы [ 2 ]

0 голосов
/ 18 января 2019

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

Помещенный

using A::get;
using B::get;

в C, чтобы объединить наборы перегрузки и таким образом устранить неоднозначность.

0 голосов
/ 18 января 2019

Неопределенность возникает, когда компилятор пытается выяснить, к какой сущности относится имя get, до разрешения перегрузки. Это может быть имя функции из класса A или из класса B. Чтобы составить список перегрузок, компилятору необходимо выбрать только один из классов, из которых следует извлекать функции. Чтобы исправить это, вы можете перенести это имя из обоих базовых классов в производный класс (и сделать их общедоступными):

class C : public A, public B { public: using A::get; public: using B::get; };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...