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
}

为什么除了(无符号)长之外的所有工作?标准长至少(像所有其他类型一样)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. 在其他编译器上,它们中的一个或多个可能是。最有可能int32_t是 的别名,int并且int64_t是 的别名long long

例如,即使intlong是相同的size,它们也不是相同的type,因此对一个的引用不能转换为对另一个的引用。事实上,您已经引用了标准中说它们是不同类型的部分。

于 2013-04-19T01:47:13.353 回答
0

C++ 标准(草案 N3225)说:

有五种标准有符号整数类型:“signed char”、“short int”、“int”、“long int”和“long long int”。在此列表中,每种类型提供的存储空间至少与列表中它前面的类型一样多。

在 MSVC12 上,我进入typedef unsigned int uint32_t;了 stdint.h。

尽管 unsigned long 也是 32 位,但它仍然是不同的类型。

因此,您的任何函数都没有被重载以将(无符号)长引用作为参数。

-edit- 如果您更改函数以按值获取参数,则由于对 tt() 的模棱两可的调用,最终会出现错误。

于 2013-04-19T01:39:54.207 回答