重载函数会产生模糊错误

时间:2013-04-19 01:15:53

标签: c++ standards overloading

我有一些重载功能,但在我的测试代码中会产生一些错误。

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) { }

代码。我想知道为什么这个演员不起作用。

2 个答案:

答案 0 :(得分:2)

因为在您的编译器中,您重载tt的所有类型都与long相同。在其他编译器上,其中一个或多个可能是。最有可能的是,int32_tint的别名,int64_tlong long的别名。

例如,即使intlong具有相同的尺寸,它们也不是相同的类型,因此参考一个不能转换为对另一个的引用。事实上,你引用了标准的一部分,说它们是不同的类型。

答案 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()的调用不明确而导致出现错误。