質問

私は次の問題に直面しています:私はクラスV(たとえばベクター)を持っています。そこから2つのクラスを作成できます:CIとI(Const_iteratorとIteratorの考え)。 const vを持っている場合、CIのみを生成することができます(再びIteratorとconst_iteratorについて考えてください)。

基本的に、(CI CI)と(V&V)を(I I)と(const V&V)に共有したいと思います。さらに、V objをA IまたはA CIを期待する関数に直接渡すことができるようにしたいので、Vとconst VからCIおよびIへの暗黙的な変換を行うことができます。

私が直面している問題は、過負荷機能が(const V&V)と(V&V)を区別できるが、私がV objに合格したときに(CI CI)と(I)を「区別」できないことです。

コード:

struct V {};

struct I 
{
    I( V& v ){}
};

struct CI
{
    CI( const V& v ){} //I would like to say const only 
};

void fun( I i )
{
    double x = 1.0;
}
void fun( CI ci )
{
    double x = 2.0;
}

void fun2( V& v )
{
    double x = 1.0;
}
void fun2( const V& v )
{
    double x = 2.0;
}

CIとIでコンストラクターを定義する代わりに、VでコンバージョンオペレーターをV(同等ですか?)で定義できたことに注意してください。

V v;
const V cv;

fun2( v );
fun2( cv );

fun( v ); //AMBIGUOUS!
fun( cv );

追加の間接を追加せずにこの問題を解決する方法はありますか(つまり、楽しい関数を変更することはできず、Vは楽しみに直接渡す必要がありますが、他のすべてを自由に変更できます)。

どんな助けをありがとうございました!

役に立ちましたか?

解決

ここで必要なのは、明示的なコンストラクターです。

struct I 
{
    explicit I( V& v ){}
};

struct CI
{
    explicit CI( const V& v ){} //I would like to say const only 
};

C ++プログラマが多すぎると、コンストラクターの明示的なキーワードを見落としています。すべての統一されたパラメーター化されたコンストラクターは、デフォルトで明示的である必要があります。暗黙のコンストラクターは、これらのような曖昧さの問題を招き、非常に間抜けで回り道の変換プロセスにつながり、問題のある非常に非効率的なコードに簡単につながる可能性があります。

今、あなたは設定されており、あいまいさの問題が解決しました。明示的なコンストラクターがいなければ、この曖昧さの問題を防ぐことはできません。

クライアントコードの場合、そのコンバージョンを明示するように変更する必要があります。

V v;
const V cv;

fun2( I(v) );
fun2( CI(cv) );

fun( I(v) );
fun( CI(cv) );

このような構文は、IまたはCIのオブジェクトを作成するために必要になりますが、それは良いことです。誰も誤って曖昧さの問題を導入することはできません。

他のヒント

ただ使用するのはどうですか typedefs?

typedef V& I;
typedef const V& CI;

編集:

いいえ。コメントを参照してください:)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top