【问题标题】:unsigned long vs size_t causes function overload failunsigned long vs size_t 导致函数重载失败
【发布时间】:2015-07-09 12:00:06
【问题描述】:

我定义了一个函数:

void myfunc(size_t param1, size_t param2){
...
}

它工作正常。但是当我尝试重载这个函数时

void myfunc(unsigned long param1, unsigned long param2){
...
}

编译失败并显示以下消息: 错误:myfunc(unsigned long param1, unsigned long param2) 不能重载。

如果不将输入参数 staic_cast 到 size_t,我该如何解决这个问题?

谢谢!

【问题讨论】:

  • 您是要标记这个 C++ 吗?
  • 这可能是因为size_t 在您的环境中被定义为unsigned long。 C/C++ 在这方面没有非常强大的类型系统。
  • 无论如何这都是个坏主意,因为即使它有效,例如,每当您尝试将函数与ints 一起使用时,都会出现模棱两可的调用错误。您能解释一下您要解决的问题吗?
  • 谢谢大家。实际上它通过了编译,但在链接阶段失败了,在这个阶段,一个宏调用了 myFunc()。

标签: c++ long-integer unsigned size-t


【解决方案1】:

听起来 size_t 和 unsigned long 在您的系统上是相同的类型;编译器抱怨你有两个相同的功能。此外,使用多种数字类型重载通常不是一个好主意,因为编译器可能无法识别您想要的重载,因为可能会进行强制转换。尝试改用模板:

template <T>
void myfunc(T param1, T param2){
...
}

【讨论】:

  • size_t 不是无符号整数吗?它可以是 unsigned int32 或 unsigned int64 但它可以是 unsigned long 吗?
  • @mhs 术语可能有点混乱; int, long, int32_t, uint32_t, etc...都是整数类型。据我所知,它们通常被定义为基本类型,例如int 或 unsigned long。不同之处在于标准保证基本类型至少为一定大小,而 intX_t 类型保证为 X 大小。因此,如果您使用的是 long 是 64 位数据类型的系统,则 uint64_t 可能只是 unsigned long。同样,如果您在 64 位系统上工作,则 size_t 也可能只是 typedef'd 为 unsigned long。
  • 谢谢大家。实际上它通过了编译,但在链接阶段失败了,在这个阶段,一个宏调用了 myFunc()。
猜你喜欢
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
  • 1970-01-01
  • 2015-08-22
  • 2012-05-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多