boost 版本 1.72.0
问题> 我应该怎么做才能解决这个构建问题?
boost_1.72.0/boost/date_time/posix_time/posix_time_config.hpp:16:
boost_1.72.0/boost/date_time/time_duration.hpp:68:5: error: definition of implicit copy assignment operator for 'time_duration<boost::posix_time::time_duration, boost::date_time::time_resolution_traits<boost::date_time::time_resolution_traits_adapted64_impl, boost::date_time::micro, 1000000, 6>>' is deprecated because it has a user-declared copy constructor [-Werror,-Wdeprecated-copy]
time_duration(const time_duration<T, rep_type>& other)
^
boost_1.72.0/boost/date_time/posix_time/posix_time_config.hpp:57:30: note: in implicit copy assignment operator for 'boost::date_time::time_duration<boost::posix_time::time_duration, boost::date_time::time_resolution_traits<boost::date_time::time_resolution_traits_adapted64_impl, boost::date_time::micro, 1000000, 6>>' first required here
class BOOST_SYMBOL_VISIBLE time_duration :
^
boost_1.72.0/boost/date_time/time_duration.hpp:286:30: note: in implicit move assignment operator for 'boost::posix_time::time_duration' first required here
class BOOST_SYMBOL_VISIBLE subsecond_duration : public base_duration
^
note: in implicit move assignment operator for 'boost::date_time::subsecond_duration<boost::posix_time::time_duration, 1000000>' first
required here
delay_int = boost::posix_time::microseconds(microSeconds);
^
class ABC
{
...
void set_delay(uint32_t microSeconds);
boost::posix_time::microseconds delay_int{0};
...
};
void ABC::set_delay(uint32_t microSeconds)
{
delay_int = boost::posix_time::microseconds(microSeconds); // this line doesn't pass compiler checking
}
Update-1:根据建议改用time_duration,问题依旧
In file included from main.cpp:4:
In file included from boost_1_72_0/boost/date_time/posix_time/posix_time.hpp:15:
In file included from boost_1_72_0/boost/date_time/posix_time/ptime.hpp:12:
In file included from boost_1_72_0/boost/date_time/posix_time/posix_time_system.hpp:13:
In file included from boost_1_72_0/boost/date_time/posix_time/posix_time_config.hpp:16:
boost_1_72_0/boost/date_time/time_duration.hpp:68:5: error: definition of implicit copy assignment operator for 'time_duration<boost::posix_time::time_duration, boost::date_time::time_resolution_traits<boost::date_time::time_resolution_traits_adapted64_impl, boost::date_time::micro, 1000000, 6>>' is deprecated because it has a user-declared copy constructor [-Werror,-Wdeprecated-copy]
time_duration(const time_duration<T, rep_type>& other)
^
boost_1_72_0/boost/date_time/posix_time/posix_time_config.hpp:57:30: note: in implicit copy assignment operator for 'boost::date_time::time_duration<boost::posix_time::time_duration, boost::date_time::time_resolution_traits<boost::date_time::time_resolution_traits_adapted64_impl, boost::date_time::micro, 1000000, 6>>' first required here
class BOOST_SYMBOL_VISIBLE time_duration :
^
main.cpp:17:15: note: in implicit move assignment operator for 'boost::posix_time::time_duration' first required here
delay_int = boost::posix_time::microseconds(
^
1 error generated.
这里是代码片段:
#define BOOST_ASIO_DISABLE_CONCEPTS
#pragma GCC diagnostic ignored "-Wsuggest-override"
#include <boost/date_time/posix_time/posix_time.hpp>
#include <iostream>
class ABC {
public:
void set_delay(uint32_t microSeconds);
private:
boost::posix_time::time_duration delay_int;
};
void ABC::set_delay(uint32_t microSeconds) {
delay_int = boost::posix_time::microseconds(
microSeconds); // this line doesn't pass compiler checking
}
int main() {
ABC abc;
abc.set_delay(123123);
std::cout << sizeof(boost::posix_time::microseconds) << " bytes\n";
std::cout << sizeof(boost::posix_time::time_duration) << " bytes\n";
}
我无法重现警告,即使使用 Boost 1.72.0、较旧的 GCC/Clang 和标志
-Wall -Werror -Wdeprecated-copy -Wextra -pedantic -Wconversion
,请参阅Live On Compiler Explorer。
#include <boost/date_time/posix_time/posix_time.hpp>
class ABC {
public:
void set_delay(uint32_t microSeconds);
private:
boost::posix_time::microseconds delay_int{0};
};
void ABC::set_delay(uint32_t microSeconds) {
delay_int =
boost::posix_time::microseconds(microSeconds); // this line doesn't pass compiler checking
}
int main() {
ABC abc;
abc.set_delay(123123);
}
一般来说只是一个警告。此外,这似乎是由于亚秒级划分并不是真正为直接使用而设计的(而是为了帮助初始化
time_duration<>
实例)。
我打赌如果你改用它,问题就会消失:
boost::posix_time::time_duration delay_int;
还请注意,这两种类型具有相同的占用空间,只是
time_duration
具有您期望的应用程序级接口。
#include <boost/date_time/posix_time/posix_time.hpp>
class ABC {
public:
void set_delay(uint32_t microSeconds);
private:
boost::posix_time::time_duration delay_int;
};
void ABC::set_delay(uint32_t microSeconds) {
delay_int = boost::posix_time::microseconds(
microSeconds); // this line doesn't pass compiler checking
}
int main() {
ABC abc;
abc.set_delay(123123);
std::cout << sizeof(boost::posix_time::microseconds) << " bytes\n";
std::cout << sizeof(boost::posix_time::time_duration) << " bytes\n";
}
打印
8 bytes
8 bytes