解决无符号长/指针的歧义
Resolve unsigned long / pointer ambiguity
我们的遗留代码使用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
构造函数,但实际上似乎无法传递无符号的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)。
如果您可以接受,您可以在构造函数中取出RWZone
的默认值:
RWTime(const struct tm* ptm, const RWZone& zone = RWZone::local());
因此它显示:
RWTime(const struct tm* ptm, const RWZone& zone);
则不能为此取0,因为RWZone
参数将丢失。
当然,您可以添加一个静态方法,允许您创建一个只接受const struct tm*
的RWTime
对象,如下所示:
static RWTime create(const struct tm* ptm) { return RWTime(ptr, RWZone::local()); }
如果可以使用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());
原来我看错了一段代码。
_time(0UL)
工作起来很有魅力。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 函数调用歧义(用户定义的转换和 Derived2Base 指针转换)
- 函数调用带有指针、引用和常量引用参数的歧义
- C++中的函数指针歧义
- 在隐式转换后的智能指针上删除函数调用中的歧义
- 消除函数指针和指向类实例的指针之间的歧义
- g++和clang++-删除由重载转换运算符歧义获取的指针
- 解决无符号长/指针的歧义
- 消除作为模板参数传递的重载成员函数指针的歧义
- C++多重继承+虚拟函数(-歧义)=怪异行为(也是函数指针)
- 在将派生类指针转换为基类时,基类有歧义
- 模板化形参的函数指针歧义
- 外部"C"、重载和函数指针可能存在歧义
- 标准中关于超出范围指针的未定义行为的歧义