我有一个带有
operator()
重载的层次结构,如下所示
class Base{
public:
virtual std::vector<float> operator()(const std::vector<float>& us) const {
// some implementation like
// return us;
}
virtual float operator()(float u) const = 0;
};
和派生类
class Derived : public Base{
public:
float operator()(float u) const override {
return u;
}
};
调用代码如下所示(假设第二个
GetAVectorOfFloats
确实是std::vector
中的float
)。
Derived d;
auto [_, us] = GetAVectorOfFloats();
auto values = d(us);
然而,编译器(gcc版本11.4.0(Ubuntu 11.4.0-1ubuntu1~22.04))吐槽
错误:与“(Derived) (std::vector&)”调用不匹配
我观察到,
const std::vector<float>&
不是一个选项(但为什么?)。
如果代码更明确的话
auto values = d.operator()(us);
错误变成
错误:无法将‘std::vector< float>’转换为‘float’
似乎我错过了一些非常基本的东西?我不能调用 Base 的 operator() 还是应该使用一些特殊的语法?
经典的名字隐藏:
当在
operator()
中查找名称 Derived
时(因为这是 d
的类型),它会找到 float operator()(float u) const;
。
然后名称查找终止,因为名称已找到。不会进一步查找基类。
解决方案是使其他重载对派生类范围内的名称查找可见:
class Derived : public Base{
public:
using Base::operator();
float operator()(float u) const override {
return u;
}
};