【问题标题】:Included function hides overloaded virtual functions包含的函数隐藏了重载的虚函数
【发布时间】:2012-10-21 12:10:37
【问题描述】:

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

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

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

显然,我不想更改我创建的类中函数的名称,我怀疑我正在做一些愚蠢的事情来解决这个问题。

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

【问题讨论】:

  • CvForestTree 是您自己的班级还是来自 OpenCV 的班级?
  • 另外,您能否发布一个重现问题的小代码sn-p。 (见SSCCE
  • 只有在子类隐藏了其基类的功能时才会产生此警告。不相关的类不能以这种方式交互。
  • 我有同样的警告,我的班级都没有名为 train 的函数...我使用的是 OpenCV 2.4.8。您是如何修复此警告的@sklum?
  • @RafaelOliveira - 很抱歉,我已经完全将我的代码库从存在问题的代码中迁移出来了,我不完全记得我是如何解决它的。当然,您可以关闭这种特定类型的编译器警告。

标签: c++ class function virtual overloading


【解决方案1】:

我的解决方案是在include/opencv2/ml/ml.hpp 内的两行中添加using CvDTree::train;。 1.在CvForestTree类定义中:

class CV_EXPORTS CvForestTree: public CvDTree
{
using CvDTree::train;

2。在 CvBoostTree 类定义中:

class CV_EXPORTS CvBoostTree: public CvDTree
{
using CvDTree::train;

【讨论】:

    【解决方案2】:

    事实上,你必须使用 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();
    

    【讨论】:

      【解决方案3】:

      问题不在于您的代码,而在于 OpenCV 的代码:CvForestTree 类派生自 CvTree 并且两个类都有 [virtual] train() 成员函数。由于CvForestTree 没有覆盖所有三个重载(我不知道它是否覆盖了任何一个,但CvForestTree 中有两个train() 重载,CvTree 中有三个),至少有一个CvTree::train()功能被隐藏。

      问题的解决方法是有一个类似的声明

      using CvTree::train;
      

      CvForestTree的定义中。当然,这不是你的课。这是警告的问题之一:通常会针对您无法控制的代码发出警告。

      【讨论】:

      • 所以我有一个具有相同函数名的类是巧合还是我误解了你?
      • @scotwheels:是的,我认为这是正确的——当然,除非你最终继承了类。您可以尝试一下:只需包含 CvForestTree 的标头,看看是否仍会产生相同的警告。
      • 它仍然会产生相同的警告,但我不太清楚你在做什么。由于它仍然只使用 CvForestTree 标头获得相同的警告......那么它不可能从 CvTree 类继承,因为它不知道 CvTree 类?
      • CvForestTree 根据some documentation 派生自CvTree。在CvTree 中有三个称为train() 的重载,在CvForestTree 中有两个重载。也就是说,CvForestTree 中的train() 声明至少隐藏了CvTree 中的三个重载之一。
      • 使用 CvDTree::train;应该使用而不是使用 CvTree::train;在 ml.hpp 中
      猜你喜欢
      • 1970-01-01
      • 2011-04-12
      • 1970-01-01
      • 2011-10-07
      • 2021-03-28
      • 1970-01-01
      • 1970-01-01
      • 2017-08-06
      相关资源
      最近更新 更多