当我尝试编译下一个构造时,我遇到了错误:无法从' std :: vector< _Ty>'转换参数1到'漂浮' 为什么要发生这种情况?
class A
{
public:
virtual int action(float)
{return 5;}
virtual int action(std::vector<float>)
{return 10;}
};
class B : public A
{
public:
int action(float) override
{return 6;}
};
class C : public B
{
public:
int action(std::vector<float>) override
{
B::action(std::vector<float>());
return 7;
}
};
int main()
{
C instance;
int temp = instance.action(std::vector<float>());
getchar();
return 0;
}
答案 0 :(得分:2)
如果派生类使用相同的名称声明函数,编译器会不搜索父类中的重载。通常,如果您启用了警告,编译器会发出警告:
警告:&#39; C :: action&#39;隐藏重载的虚函数[-Woverloaded-virtual]
如果指定声明重载的范围,则调用将起作用:
A::action(std::vector<float>());
但更一般地说,你应该总是避免重载虚函数。
答案 1 :(得分:2)
当编译器看到函数调用
时>>> y1 = np.array([[1, 2], [1, 3], [1, 2], [2, 2]])
>>> y2 = np.array([[100, 200], [100,300], [100, 200], [200, 200]])
>>> z = np.array([1, 2])
>>>
>>> (y1 == z).all(1).any()
True
>>> (y2 == z).all(1).any()
False
需要两个步骤来决定需要进行哪个函数调用。在第一步中,它会查找名称B::action(std::vector<float>());
。如果查找导致一个或多个函数,则会停止查找。它不会查找基类中的重载函数。如果查找导致多个函数名称,则会尝试重载解析。
在您的情况下,查找仅生成一个函数 - action
。查找在那里停止。但是,该函数与正在使用的参数不匹配。因此,编译器将其报告为错误。
我可以想出以下解决问题的方法。
让int B::action(float)
的所有重载都可以在A::action
B
更改通话,以便使用class B : public A
{
public:
using A::action;
int action(float) override
{return 6;}
};
A::action(float)
我强烈建议使用第一种方法。