2012-01-23 3 views
2

VS2008を使用する理由は何ですか?(2010は使用できません)符号なし__int64と__int64のオーバーロードがあいまいなのはなぜですか

void assert(int exp, int actual) {if (exp!=actual) printf("assert failed\n");} 
void assert(unsigned int exp, unsigned int actual) {if (exp!=actual) printf("assert failed\n");} 

しかし、これはあいまいです。

void assert(__int64 exp, __int64 actual) {if (exp!=actual) printf("assert failed\n");} 
void assert(unsigned __int64 exp, unsigned __int64 actual) {if (exp!=actual) printf("assert failed\n");} 

サンプルエラーテキスト

d:\my documents\visual studio 2008\projects\classtest\classtest\classtest.cpp(31) : error C2668: 'assert' : ambiguous call to overloaded function 
d:\my documents\visual studio 2008\projects\classtest\classtest\classtest.cpp(12): could be 'void assert(unsigned __int64,unsigned __int64)' 
d:\my documents\visual studio 2008\projects\classtest\classtest\classtest.cpp(10): or  'void assert(__int64,__int64)' 
while trying to match the argument list '(int, int)' 

それが唯一の '符号なし' 過負荷に関してあいまいな取得します。 "int"バージョンと "__int64"バージョンを持つことはあいまいではありません。

+0

呼び出すコードを確認する必要があります。どのタイプに変換するのかはわかりません。ところで、実際のデバッグアサートを実行するためにマクロに変換されることが多いため、あなたの関数名としてassertを使用することは避けています。 – CashCow

答えて

3

あなたのコードは実際にはintとintをパラメータとして使用しています。最初のケースでは完全に一致しています。 2番目のケースではそうではなく、int-> uint64とint-> int64を同じように有効な変換として扱い、どちらを選択するのかわからない。

+0

私はこれらの両方の変換が同じように有効であることに驚いています。符号なしの値に変換することによって潜在的に負の整数が存在するという考えを失うように見えるのは、一般的に予想されるものではありません。 (そして、はい、私はassertを使用しませんが、これは単なるサンプルです)。 – Jim

2

intが暗黙的__int64unsigned __int64の両方に変換することができますので、あなたはこれを取得しています。

次のようにもコンパイルされません:

void assert(__int64 exp, __int64 actual) {if (exp!=actual) printf("assert failed\n");} 
void assert(unsigned __int64 exp, unsigned __int64 actual){if (exp!=actual) printf("assert failed\n");} 

int x = 0; 
assert(x,x); 

しかし、あいまいさが解消される__int64xが型である場合を。

void assert(__int64 exp, __int64 actual) {if (exp!=actual) printf("assert failed\n");} 
void assert(unsigned __int64 exp, unsigned __int64 actual){if (exp!=actual) printf("assert failed\n");} 

__int64 x = 0; 
assert(x,x);\ 
//compiles