c Boost: gregorian_calendar.ipp(77,1): ошибка C2666: ‘-‘: 17 перегрузки имеют аналогичные преобразования в Visual Studio 2019 x64

#c #boost #64-bit #visual-studio-2019

#c #повышение #64-разрядный #visual-studio-2019

Вопрос:

у меня странная ошибка компиляции при попытке связать простое приложение с boost и libunistd. Теперь оба соответствуют x64, мои библиотеки ссылок :

 libboost_filesystem-vc142-mt-sgd-x64-1_75.lib
libboost_system-vc142-mt-sgd-x64-1_75.lib
libboost_thread-vc142-mt-sgd-x64-1_75.lib
libunistd.lib
libportable.lib
 

использование флагов :

 BOOST_ASIO_ENABLE_BUFFER_DEBUGGING 
BOOST_ASIO_ENABLE_HANDLER_TRACKING
 

Но я продолжаю получать :

 C:Devmycpplibsboost_1_75_0boostdate_timegregorian_calendar.ipp(77,1): error C2666: '-': 17 overloads have similar conversions
1>C:Devmycpplibslibunistd-masterunistdint128Int128.h(855,17): message : could be '_uint128 operator -(const _uint128 amp;,unsigned short)'
1>C:Devmycpplibslibunistd-masterunistdint128Int128.h(852,17): message : or       '_uint128 operator -(const _uint128 amp;,short)'
1>C:Devmycpplibslibunistd-masterunistdint128Int128.h(849,17): message : or       '_uint128 operator -(const _uint128 amp;,unsigned int)'
1>C:Devmycpplibslibunistd-masterunistdint128Int128.h(846,17): message : or       '_uint128 operator -(const _uint128 amp;,int)'
1>C:Devmycpplibslibunistd-masterunistdint128Int128.h(843,17): message : or       '_uint128 operator -(const _uint128 amp;,unsigned long)'
1>C:Devmycpplibslibunistd-masterunistdint128Int128.h(840,17): message : or       '_uint128 operator -(const _uint128 amp;,long)'
1>C:Devmycpplibslibunistd-masterunistdint128Int128.h(837,17): message : or       '_uint128 operator -(const _uint128 amp;,unsigned __int64)'
1>C:Devmycpplibslibunistd-masterunistdint128Int128.h(834,17): message : or       '_uint128 operator -(const _uint128 amp;,__int64)'
1>C:Devmycpplibslibunistd-masterunistdint128Int128.h(830,17): message : or       '_int128 operator -(const _int128 amp;,unsigned short)'
1>C:Devmycpplibslibunistd-masterunistdint128Int128.h(827,17): message : or       '_int128 operator -(const _int128 amp;,short)'
1>C:Devmycpplibslibunistd-masterunistdint128Int128.h(824,17): message : or       '_int128 operator -(const _int128 amp;,unsigned int)'
1>C:Devmycpplibslibunistd-masterunistdint128Int128.h(821,17): message : or       '_int128 operator -(const _int128 amp;,int)'
1>C:Devmycpplibslibunistd-masterunistdint128Int128.h(818,17): message : or       '_int128 operator -(const _int128 amp;,unsigned long)'
1>C:Devmycpplibslibunistd-masterunistdint128Int128.h(815,17): message : or       '_int128 operator -(const _int128 amp;,long)'
1>C:Devmycpplibslibunistd-masterunistdint128Int128.h(812,17): message : or       '_int128 operator -(const _int128 amp;,unsigned __int64)'
1>C:Devmycpplibslibunistd-masterunistdint128Int128.h(809,17): message : or       '_int128 operator -(const _int128 amp;,__int64)'
1>C:Devmycpplibslibunistd-masterunistdint128Int128.h(347,17): message : or       '_uint128 operator -(const _uint128 amp;,const _uint128 amp;)'
1>C:Devmycpplibslibunistd-masterunistdint128Int128.h(342,17): message : or       '_uint128 operator -(const _uint128 amp;,const _int128 amp;)'
1>C:Devmycpplibslibunistd-masterunistdint128Int128.h(337,16): message : or       '_int128 operator -(const _int128 amp;,const _uint128 amp;)'
1>C:Devmycpplibslibunistd-masterunistdint128Int128.h(332,16): message : or       '_int128 operator -(const _int128 amp;,const _int128 amp;)'
1>C:Devmycpplibsboost_1_75_0boostdate_timegregoriangreg_duration.hpp(119,17): message : or       'boost::gregorian::date_duration boost::gregorian::operator -(boost::gregorian::date_duration,const boost::gregorian::date_duration amp;)' [found using argument-dependent lookup]
1>C:Devmycpplibsboost_1_75_0boostdate_timegregorian_calendar.ipp(77,1): message : or       'built-in C   operator-(int, int)'
1>C:Devmycpplibsboost_1_75_0boostdate_timegregorian_calendar.ipp(77,1): message : while trying to match the argument list '(int, const MonthType)'
1>        with
1>        [
1>            MonthType=boost::gregorian::greg_month
1>        ]
1>C:Devmycpplibsboost_1_75_0boostdate_timegregorian_calendar.ipp(76): message : while compiling class template member function 'unsigned int boost::date_time::gregorian_calendar_base<boost::gregorian::greg_year_month_day,unsigned int>::day_number(const boost::date_time::year_month_day_base<boost::gregorian::greg_year,boost::gregorian::greg_month,boost::gregorian::greg_day> amp;)'
1>C:Devmycpplibsboost_1_75_0boostdate_timedate.hpp(75): message : see reference to function template instantiation 'unsigned int boost::date_time::gregorian_calendar_base<boost::gregorian::greg_year_month_day,unsigned int>::day_number(const boost::date_time::year_month_day_base<boost::gregorian::greg_year,boost::gregorian::greg_month,boost::gregorian::greg_day> amp;)' being compiled
1>C:Devmycpplibsboost_1_75_0boostdate_timegregoriangreg_calendar.hpp(28): message : see reference to class template instantiation 'boost::date_time::gregorian_calendar_base<boost::gregorian::greg_year_month_day,unsigned int>' being compiled
 

это часть наддува, которую он постоянно терпит неудачу:

 template<typename ymd_type_, typename date_int_type_>
  BOOST_CXX14_CONSTEXPR
  inline
  date_int_type_
  gregorian_calendar_base<ymd_type_,date_int_type_>::day_number(const ymd_typeamp; ymd)
  {
    unsigned short a = static_cast<unsigned short>((14-ymd.month)/12);
    unsigned short y = static_cast<unsigned short>(ymd.year   4800 - a);
    unsigned short m = static_cast<unsigned short>(ymd.month   12*a - 3);
    unsigned long  d = ymd.day   ((153*m   2)/5)   365*y   (y/4) - (y/100)   (y/400) - 32045;
    return static_cast<date_int_type>(d);
  }
 

и это int128, который продолжает терпеть неудачу

Ответ №1:

Эти операторы разработаны с учетом единообразно типизированных аргументов:

inline _uint128 operator-(const _uint128 amp;lft, const _int128 amp;rhs)

Существует также оператор C по умолчанию, который занимает две int секунды. Если ymd.month имеет тип _int128 или преобразуется в него, выражение (14-ymd.month) является неоднозначным, поскольку для любой замены потребуется равное количество преобразований типа.

Вы должны int явно преобразовать операнд.

Комментарии:

1. куда конвертировать, поскольку я имею дело с 2 библиотеками с открытыми исходными кодами