0

オーバーロードされた関数がありますが、テスト コードでいくつかのエラーが生成されます。

inline void tt(uint8_t& v) { }
inline void tt(int8_t& v) { }
inline void tt(char& v) { }
inline void tt(uint16_t& v) { }
inline void tt(int16_t& v) { }
inline void tt(uint32_t& v) { }
inline void tt(int32_t& v) { }
inline void tt(uint64_t& v) { }
inline void tt(int64_t& v) { }

int main(int argc, char* argv[]) {
    unsigned char t1;
    signed char t2;
    unsigned short t3;
    short t4;
    unsigned int t5;
    int t6;
    unsigned long t7;
    long t8;
    char t9;

    tt(t1);  // ok
    tt(t2);  // ok
    tt(t3);  // ok
    tt(t4);  // ok
    tt(t5);  // ok
    tt(t6);  // ok
    tt(t7);  // error
    tt(t8);  // error
    tt(t9);  // ok
}

(unsigned) long 以外はすべて機能するのはなぜですか? 標準的なlongを見ると、少なくとも (他のすべてのタイプと同様に) 32 ビットです。

There are five standard signed integer types: “signed char”, “short int”, “int”, “long int”, and “long long int”. In this list, each type provides at least as much storage as those preceding it in the list.

挿入することでこれを回避できます

inline void tt(unsigned long int& v) { }
inline void tt(long int& v) { }

コードに。このキャストが機能しない理由を知りたいだけです。

4

2 に答える 2

2

コンパイラでは、オーバーロードした型はどれも とtt同じではないためlongです。他のコンパイラでは、それらの 1 つまたは複数が存在する可能性があります。ほとんどの場合、int32_tは のエイリアスでintあり、int64_tは のエイリアスですlong long

たとえば、intlongが同じサイズであっても、同じではないため、一方への参照を他方への参照に変換することはできません。実際、あなたはそれらが異なるタイプであると言っている標準の部分を引用しました。

于 2013-04-19T01:47:13.353 に答える
0

C++ 標準 (ドラフト N3225) には次のように書かれています。

標準の符号付き整数型には、「signed char」、「short int」、「int」、「long int」、および「long long int」の 5 つがあります。このリストでは、各タイプは、少なくともリスト内の前のタイプと同じ量のストレージを提供します。

MSVC12typedef unsigned int uint32_t;では、stdint.h に入ります。

unsigned long も 32 ビットですが、別の型です。

したがって、(符号なし) 長い参照を引数として取るためにオーバーロードされている関数はありません。

-編集- 関数を変更してパラメータを値で受け取るようにすると、tt() のあいまいな呼び出しが原因でエラーが発生します。

于 2013-04-19T01:39:54.207 に答える