Наш старый код использует библиотеку 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).
Если это приемлемо для вас, вы можете взять значение по умолчанию для 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()); }
Если вы можете использовать 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());
Оказалось, я все-таки смотрю на неправильный кусок кода.
_time(0UL)
работает как шарм.