C++ 方法调用 (lvalue) 绑定到派生类中的函数 (rvalue),而不是基类中的函数 (lvalue)
c++ method call (lvalue) binding to function(rvalue) in derived class instead of function(lvalue) in base class
我是C++新手,并尝试编写如下接口:
template <class T>
class Comparable
{
protected:
Comparable(){};
public:
virtual int compare(const T&&)=0;
int compare(const T& o)
{
return this->compare(std::move(o));
}
};
我这样做是为了尝试让比较方法同时使用两个 l/r 值。 我从 Comparable 派生了以下类:
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);
}
};
使用 main() 方法如下:
Monkey m1(argv[1]), m2(argv[2]);
printf(""%s" "%s" %dn", m1.getName(), m2.getName(), m2.compare(m1));
但是我收到一个编译错误:
无法将"测试::猴子">的左值绑定到"常量测试::猴子&&" 初始化"虚拟整数测试::猴子::比较(常量测试::猴子&&)"的参数 1 构建失败
为什么方法调用未绑定到基类中的比较方法?
当我在基类中将它们创建为虚拟并在派生类中将它们都写入时,绑定工作正常,但它不起作用,如果我尝试按照此处编写的方式编译它,则会出现编译错误。
这是名称隐藏;派生类中的名称隐藏基类中的名称。简而言之,您不能通过不同的作用域重载函数。
根据非限定名查找的规则,对于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);
}
};
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 为什么这些代码仍然使用 lvalue 函数?
- 与构造函数中rvalue结合的非const lvalue有关的错误
- C++:在没有 lvalue 的情况下调用时复制构造函数不起作用
- C++:无法使用条件类型在模板函数中使用 'double' 类型的 lvalue 初始化 'char*' 类型的参数
- C++ 方法调用 (lvalue) 绑定到派生类中的函数 (rvalue),而不是基类中的函数 (lvalue)
- 如何在用std ::前进的构造函数中制作const lvalue
- C ,为什么可以将RVALUE传递到将lVALUE参考作为参数的函数
- 无法在函数main中编译,需要Lvalue