我正在使用OpenCV开发一个系统。该系统具有一个具有虚函数的类,该函数与OpenCV使用的虚函数具有相同的名称(train)。当我编译时,我收到以下警告:
/opt/local/include/opencv2/ml/ml.hpp:957:18:警告: 'CvForestTree :: train'隐藏了重载的虚函数 [-Woverloaded虚拟]
与隐藏重载虚函数相关的大多数问题都涉及类和派生类,但在这种情况下我的(可能是不正确的)假设问题是OpenCV类实现的函数具有相同的名称。请注意,必须包含OpenCV标头才能使我的函数类定义起作用。
显然,我不想在我上课时更改该功能的名称,我怀疑我做了一些愚蠢的事情来解决这个问题。
编辑:CvForestTree是OpenCV的类,不是我的。我不确定导致问题的代码行的确切区域,因为包含OpenCV头的任何文件都会发出警告。也许这意味着它是一个OpenCV错误。答案 0 :(得分:5)
问题不在于您的代码,而在于OpenCV的代码:CvForestTree
类派生自CvTree
,并且这两个类都具有[虚拟] train()
成员函数。由于CvForestTree
没有覆盖所有三个重载(我不知道它是否覆盖了train()
中有两个CvForestTree
重载,CvTree
中有三个重载,至少有一个CvTree::train()
函数被隐藏。
解决问题的方法是使用
之类的声明using CvTree::train;
在CvForestTree
的定义中。当然,这不是你的班级。这是警告的问题之一:通常是为你无法控制的代码发出的。
答案 1 :(得分:0)
实际上你必须使用CvDTree :: train添加它;在ml.hpp的几个地方:
class CV_EXPORTS CvBoostTree: public CvDTree
{
public:
using CvDTree::train;
CvBoostTree();
class CV_EXPORTS CvForestTree: public CvDTree
{
public:
using CvDTree::train;
CvForestTree();
答案 2 :(得分:0)
我的解决方案是在using CvDTree::train;
的两行中添加include/opencv2/ml/ml.hpp
。 1.在CvForestTree类定义内:
class CV_EXPORTS CvForestTree: public CvDTree
{
using CvDTree::train;
2。在CvBoostTree类定义中:
class CV_EXPORTS CvBoostTree: public CvDTree
{
using CvDTree::train;