2

VS2008 を使用して、なぜこれで問題ないのですか (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」バージョンがあることは、あいまいではありません。

4

2 に答える 2

3

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

于 2012-01-23T14:59:55.117 に答える
2

と の両方に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
于 2012-01-23T14:59:10.803 に答える