Устранить неопределенность длинных / указателей без знака

Наш старый код использует библиотеку RogueWave. Я пытаюсь построить объект RWTime из литерала 0. Однако все, что я делаю, похоже, не дает эффекта, и у компилятора все еще есть два конструктора на выбор:

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).

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()); }
0

Другие решения

Если вы можете использовать c11, вы не можете переопределить вашу проблему, используя nullptr и nullptr_t:
Компилятор может выбирать между указателем и функцией int, когда значение равно 0 (или NULL также равно 0).

Вы должны определить новую функцию, которая принимает nullptr_t для избежания неоднозначности:

   RWTime::RWTime( std::nullptr_t np)

И, конечно же, использовать std::nullptr для нулевых указателей

Поскольку вы указываете, что невозможно изменить код библиотеки, я предлагаю второе решение:
Определите промежуточную переменную, чтобы дать подсказку компилятору, какую функцию нужно выбрать

    unsigned long tmp = 0;
_time(tmp);

Другим способом можно дать второй параметр:

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

Оказалось, я все-таки смотрю на неправильный кусок кода.

_time(0UL)

работает как шарм.

0
По вопросам рекламы [email protected]