我有一些重载功能,但在我的测试代码中会产生一些错误。
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
}
为什么所有工作除了(无符号)长?在standard长看是至少(和所有其他类型一样)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) { }
代码。我想知道为什么这个演员不起作用。
答案 0 :(得分:2)
因为在您的编译器中,您重载tt
的所有类型都与long
相同。在其他编译器上,其中一个或多个可能是。最有可能的是,int32_t
是int
的别名,int64_t
是long long
的别名。
例如,即使int
和long
具有相同的尺寸,它们也不是相同的类型,因此参考一个不能转换为对另一个的引用。事实上,你引用了标准的一部分,说它们是不同的类型。
答案 1 :(得分:0)
C ++标准(草案N3225)说:
有五种标准的有符号整数类型:“signed char”,“short int”,“int”,“long int”和“long long int”。在此列表中,每种类型至少提供与列表中前面的存储一样多的存储空间。
在MSVC12上,我在stdint.h中得到typedef unsigned int uint32_t;
。
尽管unsigned long也是32位,但它仍然是一种不同的类型。
因此,没有任何函数被重载以将(无符号)长引用作为参数。
CNC中 如果您更改函数以按值获取其参数,则由于对tt()的调用不明确而导致出现错误。