包含的功能隐藏了重载的虚拟功能

时间:2012-10-31 21:57:31

标签: c++ class function virtual overloading

我正在使用OpenCV开发一个系统。该系统具有一个具有虚函数的类,该函数与OpenCV使用的虚函数具有相同的名称(train)。当我编译时,我收到以下警告:

  

/opt/local/include/opencv2/ml/ml.hpp:957:18:警告:   'CvForestTree :: train'隐藏了重载的虚函数   [-Woverloaded虚拟]

与隐藏重载虚函数相关的大多数问题都涉及类和派生类,但在这种情况下我的(可能是不正确的)假设问题是OpenCV类实现的函数具有相同的名称。请注意,必须包含OpenCV标头才能使我的函数类定义起作用。

显然,我不想在我上课时更改该功能的名称,我怀疑我做了一些愚蠢的事情来解决这个问题。

编辑:CvForestTree是OpenCV的类,不是我的。我不确定导致问题的代码行的确切区域,因为包含OpenCV头的任何文件都会发出警告。也许这意味着它是一个OpenCV错误。

3 个答案:

答案 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;