我是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;写在这里。
答案 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