5

コンストラクターをintとでオーバーロードしようとしchar *ます。次に、との呼び出しにあいまいさがあります0。これに対する回避策/解決策はありますか?

CBigInt (unsigned int);
CBigInt (const char *);

問題は次のようになっています0

CBigInt a;
// some more code
 a *= 0; 

回答ありがとうございます。

4

4 に答える 4

10

コンストラクターの1つを明示的にします。渡されたタイプが完全に一致する場合にのみ使用されます。

CBigInt (unsigned int);
explicit CBigInt (const char *);
于 2011-03-31T11:34:16.753 に答える
6

「explicit」キーワードを使用できます。

explicit CBigInt(const char *);

これを使用して、引数をconst char *に明示的にキャストする必要があります。そうしないと、CBigInt(unsigned)が実行されます。

于 2011-03-31T11:34:04.807 に答える
2

「明示的な」アプローチは機能しますが、将来の開発者をサポートするために直感的ではない可能性があります。このような場合、私が取り組んだ以前のプロジェクトでは、静的ファクトリメソッドを使用しました。プライベートのデフォルトコンストラクターがあり、静的ファクトリのメンバーを明示的に初期化します。何かのようなもの:

class CBigInt {
public:
...
static CBigInt fromUInt(unsigned int i) { 
    CBigInt result; 
    result.value=i; 
    return result; 
}
static CBigInt fromCharPtr(const char* c) { 
    CBigInt result; 
    result.value=parse(c); 
    return result; 
}
...
private:
CBigInt () {}
/*some internal type here*/ value; 
};

このアプローチにより、コンパイラーだけでなく、後でコードをサポートするコンパイラーのあいまいさもなくなります。

于 2011-03-31T12:07:51.473 に答える
1

この場合、コンストラクター(コンストラクターが取る)は数値(クラスexplicitがモデル化する)をモデル化しないと思うので、コンストラクターもお勧めします。CBigIntそのような場合は、そのexplicitために設計されたものです。

ただし、これは直接初期化が使用されている場合には機能しません

struct A {
  CBigInt n;
  A():n(0) { } // ambiguity again
};

一般に、explicit内部のあいまいさを解決するために使用しないでください。あるタイプから別のタイプへの変換を禁止するためにのみ使用する必要がありますが、コンストラクターよりも別のコンストラクターを優先するためには使用しないでくださいexplicit。実際、新しいC ++ 0xの統一初期化では、コピー初期化コンテキストのコンストラクターは無視されません。explicit

CBigInt f() {
  return { 0 }; // still ambiguous
}

CBigInt b = { 0 }; // still ambiguous

均一な初期化のルールは次のとおりです。両方のコンストラクターが考慮されますが、明示的なコンストラクターが選択された場合、初期化の形式が正しくありません。

リテラル0intです。すべての整数型を受け入れることができるようにしたい場合は、少なくともtakeingintコンストラクターを追加する必要があります。よりも小さい整数型にはオーバーロードを追加する必要はありません。これらの型は他の整数変換またはポインターよりもint優先されるためです。intオーバーロードがあると仮定するとint、残りの整数型にオーバーロードを追加する必要があります。使用可能な場合は、それを使用しlong longますunsigned long long。そうすれば、あいまいさはもう発生しなくなります。

CBigInt (int);
CBigInt (unsigned int);
CBigInt (long);
CBigInt (unsigned long);
// CBigInt (long long);
// CBigInt (unsigned long long);
explicit CBigInt (const char *);
于 2011-03-31T14:38:29.190 に答える