2

私はOpenCVを使用してシステムを開発しています。このシステムには、OpenCVで使用される仮想関数と同じ名前(train)の仮想関数を持つクラスがあります。コンパイルすると、次の警告が表示されます。

/opt/local/include/opencv2/ml/ml.hpp:957:18:警告:'CvForestTree::train'はオーバーロードされた仮想関数を非表示にします[-Woverloaded-virtual]

オーバーロードされた仮想関数の非表示に関連するほとんどの質問はクラスと派生クラスを扱いますが、この場合、私の(おそらく間違った)仮定は、OpenCVが実装するクラスが同じ名前の関数を持っているということです。関数のクラス定義を機能させるには、OpenCVヘッダーを含める必要があることに注意してください。

明らかに、私が作成したクラスの関数の名前を変更したくないので、この問題を解決するために愚かなことをしているのではないかと思います。

編集:CvForestTreeはOpenCVのクラスであり、私のものではありません。OpenCVヘッダーを含むファイルに対して警告が発生するため、問題の原因となるコード行の正確な領域がわかりません。多分それはそれがOpenCVのバグであることを意味します。

4

3 に答える 3

5

問題はコードではなく、OpenCVのコードにあります。CvForestTreeクラスは派生元でCvTreeあり、両方のクラスに[仮想]train()メンバー関数があります。は3つのオーバーロードすべてをオーバーライドしないためCvForestTree(オーバーライドするかどうかはわかりませんが、2つのtrain()オーバーロードCvForestTreeと3つのオーバーロードがありますCvTree)、少なくとも1つのCvTree::train()関数が非表示になっています。

この問題の修正は、次のような宣言を行うことです。

using CvTree::train;

の定義でCvForestTree。もちろん、これはあなたのクラスではありません。これは、警告の問題の1つです。制御できないコードに対しては、多くの場合、これらが発行されます。

于 2012-10-31T22:18:43.143 に答える
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();
于 2016-01-26T00:48:14.693 に答える