类层次结构中的运算符重载解析

问题描述 投票:0回答:1

我有一个带有

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() 还是应该使用一些特殊的语法?

c++ inheritance operator-overloading
1个回答
1
投票

经典的名字隐藏:

当在

operator()
中查找名称
Derived
时(因为这是
d
的类型),它会找到
float operator()(float u) const;

然后名称查找终止,因为名称已找到。不会进一步查找基类。

解决方案是使其他重载对派生类范围内的名称查找可见:

class Derived : public Base{
public:
    using Base::operator();
    float operator()(float u) const override {
        return u;
    }
};
© www.soinside.com 2019 - 2024. All rights reserved.