0

我们的遗留代码使用 RogueWave 库。我正在尝试从 0 文字构造一个 RWTime 对象。但是,我所做的任何事情似乎都没有效果,编译器仍然有两个构造函数可供选择:

error: call of overloaded 'RWTime(int)' is ambiguous
   _time(static_cast<unsigned long>(0))
                                      ^
note: candidates are:
RWTime::RWTime(const tm*, const RWZone&)
     RWTime(const struct tm* ptm, const RWZone& zone = RWZone::local());
     ^
RWTime::RWTime(long unsigned int)
     RWTime(unsigned long s)
     ^
constexpr RWTime::RWTime(const RWTime&)
 class RW_DEPRECATE_TYPE("Use RWDateTime instead") RW_TOOLS_SYMBOLIC RWTime
                                                                     ^
constexpr RWTime::RWTime(RWTime&&)

我想使用unsigned long构造函数,但我似乎无法真正传递 unsigned long。我试过了:

_time(static_cast<unsigned long>(0))
_time((unsigned long)0)
_time(0UL)
_time(0)

但没有效果。也许问题在于指针具有uintptr_t类型,它与size_ttype 同义,而 type 与unsigned long. 然后实际上有两个构造函数采用unsigned long.

编辑:我检查了 RWTime 类文档,他们提到了这个问题:“编译器可以将 0 解析为整数或指针。因为还有一个构造函数需要一个指针 (to struct tm),如果你想从值 0 ,unsigned long您必须明确:

RWTime earlyTime((unsigned long)0);

但是,由于某种原因,它对我不起作用(使用 c++11)。

4

3 回答 3

0

如果您可以使用 c11,则无法使用 nullptr 和 nullptr_t 覆盖您的问题:当值为 0(或 NULL 也为 0)时,编译器可以在指针和 int 函数之间进行选择。

您必须定义一个接受 nullptr_t 的新函数以避免模棱两可:

   RWTime::RWTime( std::nullptr_t np)

当然,std::nullptr用于空指针

正如您指出的那样,无法更改库代码,我提出了第二种解决方案:定义一个中间变量,为编译器提供必须选择哪个函数的线索

    unsigned long tmp = 0;
    _time(tmp);

另一种方法可以给出第二个参数:

     _time(0, RWZone::local());
于 2015-12-08T10:23:35.343 回答
0

如果您可以接受,您可以在构造函数中取出默认值RWZone

RWTime(const struct tm* ptm, const RWZone& zone = RWZone::local());

所以它显示:

RWTime(const struct tm* ptm, const RWZone& zone);

然后不能为此取 0,因为该RWZone参数将丢失。

当然,您可以添加一个静态方法,允许您创建一个RWTime只需要const struct tm*这样的对象:

static RWTime create(const struct tm* ptm) { return RWTime(ptr, RWZone::local()); }
于 2015-12-08T10:26:32.447 回答
0

原来我毕竟看错了一段代码。

_time(0UL)

奇迹般有效。

于 2016-03-10T19:39:11.017 回答