Вопрос

struct B1{
  int d;
  void fb(){};
};

struct B2 : B1{
  using B1::d;
  using B1::fb;

  int d;               // why this gives error?
  void fb(){}          // and this does not?
};

int main(){}

Это потому, что, потому что, B1::fb() рассматривается как B1::fb(B1*) and B2::fb() рассматриваемый как B2::fb(B2*)? То есть, неявный параметр, поможет в отличить их?

$13.3.1/4-

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

Это было полезно?

Решение

Стандарт C ++ (C ++ 03 §7.3.3 / 12) объясняет:

Когда Использование-декларация Объединяет имена из базового класса в полученный класс, функции членов в производных классах и / или скрывают функции элементов с тем же именем и типами параметров в базовом классе (а не противоречивые).

В вашем примере, B2::fb() скрывает B1::fb() введен с помощью декларации.

Что касается того, почему это плохо сформировано, чтобы иметь оба using B1::d; а также int d; в определении B2, стандарт C ++ (C ++ 03 §7.3.3 / 10) объясняет:

С А. Использование-декларация является декларацией, ограничения на объявления одинакового имени в том же декларативном регионе также относятся к Использование-декларации.

Итак, оно плохо сформировано по той же причине, что ниже сформировано следующее: он приводит к двум объектам с тем же именем в одном декларативном регионе:

struct S { int d; int d; };
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top