解决无符号长/指针歧义

时间:2015-12-08 09:47:41

标签: c++ c++11 redhat rogue-wave

我们的遗留代码正在使用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_t类型同义,与unsigned long同义。然后实际上有两个构造函数采用unsigned long

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

RWTime earlyTime((unsigned long)0);

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

3 个答案:

答案 0 :(得分:0)

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

你必须定义一个接受nullptr_t的新函数,以避免含糊不清:

   RWTime::RWTime( std::nullptr_t np)

当然,使用std::nullptr作为空指针

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

    unsigned long tmp = 0;
    _time(tmp);

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

     _time(0, RWZone::local());

答案 1 :(得分:0)

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

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

所以它写着:

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

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

当然,你可以添加一个静态方法,允许你创建一个只RWTime的{​​{1}}对象:

const struct tm*

答案 2 :(得分:0)

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

_time(0UL)

就像一个魅力。