函数未解析为基础 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
}
};
我尝试在这个(简化的)示例中使用 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
}
};