函数未解析为基础 class 重载

Function not resolving to base class overload

我尝试在这个(简化的)示例中使用 CRTP:

基础class:

template <class Derived>
class Base
{
public: 
    int method(int in, int& out2)
    {
        return derived().method(in, out2);
    }

    int method(int in)
    {
        int dummy;
        return this->predict(in, dummy);
    }

protected:
    Base() {}
private:
    Derived& derived()
    {
        return *static_cast<Derived*>(this);
    }
};

派生 class:

class Derived : public Base<Derived>
{
public: 
    int method(int in, int& out2)
    {
        // Logic here
    }
};

问题是,当我尝试将 method(int in)Derived class 的实例一起使用时,例如:

Derived d;
int res = d.method(5);

编译器(在本例中为 icc,但也尝试过使用 msvc)给出了以下错误:

error #165: too few arguments in function call

似乎编译器没有意识到存在一个只接受一个参数的重载,来自 Base<Derived> class(Derived 公开继承,所以我认为它应该是可以访问的)。

我不确定我在这里遗漏了什么,任何提示将不胜感激。

Derived::method 的存在意味着编译器在尝试绑定调用时不会考虑 Base::method 的重载。要解决此问题,请将 using Base::method; 添加到派生的 class:

class Derived : public Base<Derived>
{
public:
    using Base::method; 
    int method(int in, int& out2)
    {
        // Logic here
    }
};

当非虚函数定义为与 Base::method 同名时,它 遮盖 Derived 中的 Base::method class,也称为 名称隐藏

为了防止这种情况,您必须使用 using 运算符明确提及带有 class 的方法名称,即您的 Derived class 代码应该是修改为:

class Derived : public Base<Derived>
{
public: 
    using Base::method; //makes the 'method' declaration of Base class 
                        //visible here as well.
    int method(int in, int& out2)
    {
        // Logic here
    }
};