int64和time_t之间的C ++重载歧义

时间:2018-06-27 13:12:25

标签: c++ public

我有一个需要在32位和64位linux平台上编译的类Format。

该类具有添加原始值,然后根据格式字符串格式化值的方法。 printf(...)

的封装

我的课看起来像这样:

class Format
{
public:
    Format(string fmt);
    add(int16_t x);
    add(int32_t x);
    add(int64_t x);
    add(time_t x);
}

当我编译32位代码时,因为int64_t和time_t转换为不同类型,所以代码会编译。 如果我编译为64位,则会得到:

  

错误:‘Format :: add(time_t)’不能重载

如果删除add(time_t x),则会从32位编译器中收到编译错误:

  

错误:重载的“ add(time_t&)”的调用不明确

我了解编译失败的原因。

但是我看不到针对此问题的最佳解决方案吗?

我不想在调用方将time_t强制转换为int64_t。

那么我该如何实现多平台支持的最佳方法呢?

添加add(...)的“ long”和“ int”重载版本时,我也遇到类似的问题。

问候 克劳斯

1 个答案:

答案 0 :(得分:0)

time_t通常是带符号的32位或带符号的64位整数类型。 (它的实际类型不受C ++标准的保证。)

如果您所使用的平台与固定宽度整数类型之一是typedef基本类型相同,那么编译器将无法区分您的功能。

最好的解决方法是从C程序员的书中摘下来并使用

someMethod_time_t(time_t x)

以此类推。