c ++方法调用(左值)绑定到派生类中的函数(rvalue)而不是基类中的函数(左值)

时间:2017-03-14 08:20:23

标签: c++ binding virtual lvalue rvalue

我是C ++新手并尝试编写如下界面:

class Monkey : Comparable<Monkey>
{
   private:
      char name[512];
   public:
      Monkey(const char*&& name)
      {
         strcpy(this->name, name);
      }
      const char *getName() { return name; }
      int compare(const Monkey&& m)
      {
         return strcmp(name, m.name);
      }
};

我这样做是为了让比较方法与两个l / r值一起使用。 我从Comparable派生了以下类:

Monkey m1(argv[1]), m2(argv[2]);
printf("\"%s\" \"%s\" %d\n", m1.getName(), m2.getName(), m2.compare(m1));

使用main()方法如下:

{{1}}

但是我收到了编译错误:

无法绑定&#39;测试:: Monkey&#39;左值&#39; const测试::猴子&amp;&amp;&#39; 初始化&#39; virtual int的参数1测试:: Monkey :: compare(const Tests :: Monkey&amp;&amp;)&#39; 构建失败

为什么方法调用没有绑定到基类中的compare方法?

当我在基类中创建它们并将它们都写在派生类中时,绑定工作正常,但它不起作用,如果我尝试编译它,我会得到编译错误#39;写在这里。

1 个答案:

答案 0 :(得分:3)

这是名字隐藏;派生类中的name隐藏基类中的名称。简而言之,您不能通过不同的范围重载函数。

根据unqualified name lookup的规则,对于m2.compare(m1)m2的类型为Monkey,名称compare将在Monkey的范围内找到首先派生类compare,然后名称查找停止。基类中的using根本不会考虑以下重载决策。

(强调我的)

  

对于非限定名称,即名称不在范围解析运算符::右侧的名称,名称查找检查范围如下所述,直到找到至少一个任何类型的声明,此时查找停止,不再检查其他范围

您可以通过class Monkey : Comparable<Monkey> { ... using Comparable<Monkey>::compare; int compare(const Monkey&& m) { return strcmp(name, m.name); } }; 将基类的名称引入派生类的范围:

/sys