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