unsigned __int64と__int64があいまいなのなのはなぜですか
-
12-11-2019 - |
質問
VS2008を使用する、なぜこれがOK(2010を使用できません)のなぜ
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"バージョンがあいまいではありません。
解決
あなたのコードは実際にはintとintをパラメータとして使っています。最初のケースでは完全に一致しています。2番目のケースではそうではなく、int-> uint64とint-> int64を等しく有効な変換を扱うように扱います。
他のヒント
int
は、__int64
および unsigned __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);
しかしx
が__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");}
__int64 x = 0;
assert(x,x);\
//compiles