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=
。ここでの問題は、そのようなコードを書き
- 誰でも自分の手が上記のOpenCVのソースに
- を切っているはず、
Range
パラメータ(Range
関連の機能だけで上記されているを取るoperator=
のない再定義がないことですVector
の定義、行1033から開始)
明らかに、私はopenCVソースがコンパイルするので、何か不足しています。私の質問は、それが合法になるr = Range(0, d.size());
行で実際に何が起こっているのですか?
質問に答えるためにRange :: operator =の実装(または少なくとも宣言)が必要です... – Staffan
'Vector'クラスの直前で定義された' Range :: operator'関数がたくさんありますただし、 'operator ='はそれらの1つではありません。おそらく、それは暗黙的に定義されたデフォルト演算子です。 – suszterpatt