我很难理解为什么在派生类实现void operator()(int)
时,下面代码示例中基类中的void operator()(int,int,int)
声明似乎是隐藏的。如何从基类foo
获取operator()(int)的声明,以便在派生类bar
中可见?也就是说,如何修改示例以便调用operator()(int)?
#include <iostream>
struct foo
{
void operator()(int)
{
std::cout << "A" << std::endl;
}
};
struct bar : foo
{
// If this is uncommented, the code will not compile.
// void operator()(int, int, int) {}
};
int main()
{
bar b;
b(1);
return 0;
}
当使用g ++编译并且标记的行未注释时,错误消息的行是“不匹配调用'bar(int)'...候选者是空bar :: operator()(int,int, int)...候选人需要3个参数,1提供。“
答案 0 :(得分:6)
没错。派生类函数隐藏基类函数而不是重载。修复非常简单:
struct bar : foo
{
using foo::operator();
void operator()(int, int, int) {}
};
答案 1 :(得分:2)
请注意,operator()可能会让它看起来比它更混乱。经典的例子可能更像是bar :: mymethod(int)和foo :: mymethod()。由于分辨率如何发生,派生方法隐藏了继承的方法。另一个答案中解释的使用声明引入了foo的解决方法。