1

Xcode で OpenCV C++ コードを使用するプロジェクトをコンパイルしようとしています。

template<typename _Tp> inline MatND_<_Tp>& MatND_<_Tp>::operator = (const MatND& m)
{
    if( DataType<_Tp>::type == m.type() )
    {
        Mat::operator = (m);
        return *this;
    }
    if( DataType<_Tp>::depth == m.depth() )
    {
        return (*this = m.reshape(DataType<_Tp>::channels));
    }
    CV_DbgAssert(DataType<_Tp>::channels == m.channels());
    m.convertTo(*this, DataType<_Tp>::type);
    return *this;
}

ここで、「Mat::operator = (m);」行で「オブジェクト引数なしの非静的メンバー関数の呼び出し」というコンパイラ エラーが発生します。

コードは壊れていません。ここで確認しました。

もう 1 つの興味深い点は、コンパイラを LLVM GCC 4.2 として選択した場合、コードは正常に動作しますが、Apple LLVM コンパイラ 3.2 でコンパイルするとこのエラーが発生することです。GCC でコンパイルすると他の問題が発生するため、Apple LLVM コンパイラでコンパイルする必要があります。

ここでの問題は何ですか?

4

1 に答える 1

2

使用する必要があります

this->Mat::operator = (m);

テンプレート化されたメンバー関数内にいる場合、コンパイラは基本クラスが何であるかを認識しません。静的メンバー関数を呼び出そうとしているように見えますが、 Mat::operator=() は静的ではないため、そのエラーが発生します。this->Mat::operator=(m) を使用することにより、コンパイラは、実際に非静的メンバー関数を呼び出そうとしていることを認識します。

古いコンパイラでは、テンプレートが最初に検出されたときのチェックが少なくなりました。それらの大部分はトークンの大きなシーケンスとして保存され、テンプレートがインスタンス化されたときにのみチェックが行われました。C++ 標準では、テンプレートをインスタンス化する前に一定量のチェックを行う必要があるため、このような特定のトリックが必要になります。

于 2012-08-17T05:04:58.473 に答える