2010-12-01 5 views
5

Iは、(Vectorクラスの定義でcxoperations.hpp、ライン1134)OpenCVのソースのコードのこの部分につまずい:Vectorクラスがデータ部材がrと呼ばれていない(実際にしたことをOpenCVはconst参照に代入されますか?

Vector(const Vector& d, const Range& r) 
{ 
    if(r == Range::all()) 
     r = Range(0, d.size()); 

    // some more stuff... 
} 

注、識別子rは、別のメソッドのパラメータとして、クラス定義全体のもう1つの場所でのみ発生します)。だから明らかに、それはconst参照への割り当てです。

私は、最小限の例を再現してみました:

#include <iostream> 

class Foo 
{ 
    public: 
    int _a; 
    Foo(int a) : _a(a) {} 
}; 

int main() 
{ 
    Foo x(0); 
    const Foo& y = x; 
    printf("%d\n", y._a); 
    y = Foo(3); 
    printf("%d\n", y._a); 
} 

これ、もちろん、コンパイルに失敗:エラーに

test.cpp:15: error: passing `const Foo' as `this' argument of `Foo& Foo::operator=(const Foo&)' discards qualifiers 

を与える++グラム、私はそれが動作するようになった唯一の方法は、オーバーライドすることです予想通り

#include <iostream> 

class Foo 
{ 
    public: 
    int _a; 
    Foo(int a) : _a(a) {} 
    Foo& operator=(Foo rhs) const 
    { 
     Foo& tmp = const_cast<Foo&>(*this); 
     tmp._a = rhs._a; 
     return const_cast<Foo&>(*this); 
    } 
}; 

int main() 
{ 
    Foo x(0); 
    const Foo& y = x; 
    printf("%d\n", y._a); 
    y = Foo(3); 
    printf("%d\n", y._a); 
} 

これは、コンパイル、およびプリント "0〜3":このようなoperator=。ここでの問題は、そのようなコードを書き

  1. 誰でも自分の手が上記のOpenCVのソースに
  2. を切っているはず、Rangeパラメータ(Range関連の機能だけで上記されているを取るoperator=のない再定義がないことですVectorの定義、行1033から開始)

明らかに、私はopenCVソースがコンパイルするので、何か不足しています。私の質問は、それが合法になるr = Range(0, d.size());行で実際に何が起こっているのですか?

+0

質問に答えるためにRange :: operator =の実装(または少なくとも宣言)が必要です... – Staffan

+0

'Vector'クラスの直前で定義された' Range :: operator'関数がたくさんありますただし、 'operator ='はそれらの1つではありません。おそらく、それは暗黙的に定義されたデフォルト演算子です。 – suszterpatt

答えて

7

私はcvのVectorがクラステンプレートであることに気付きました。そのクラスメソッドがインスタンス化されなかった場合、コンパイルエラーは発生しませんでした。私が推測するのは、試してみると、

Vector<int> a; 
Vector<int> b(a, Range::all()); 

その疑わしいラインでコンパイルエラーが発生します。その後、OpenCVソースのバグとして報告することができます。

2

私の理論は、問題のコードは決して使用されないため、インスタンス化されないということです。結局のところ、Vectorはテンプレートです。

は、このコードを考えてみましょう:

template <class T> 
class Vector 
{ 
public: 
    Vector() 
    { 
    } 

    Vector(const Vector & x, const int & y) 
    { 
     y = 54; 
    } 
}; 
// template class Vector<float>; 

void foo() 
{ 
    Vector<float> v1; 
// Vector<float> v2(v1, 42); 
} 

GCC(バージョン4.5.1)は、これを受け入れますが、できるだけ早くあなたが二コンストラクタまたはeplicitのテンプレートのインスタンスにその呼び出しを追加すると文句を言います。

0

あなたはバグレポートhereとして投稿するか、OpenCVニュースグループにY!Gのメッセージを投稿するか、 "[email protected]"の開発者リストに直接投稿することをお勧めします。

関連する問題