C++ C++;Boost-序列化错误-传递‘;常数B’;as‘;这’;参数丢弃限定符
我正在尝试使用C++ C++;Boost-序列化错误-传递‘;常数B’;as‘;这’;参数丢弃限定符,c++,serialization,boost,C++,Serialization,Boost,我正在尝试使用Boost序列化一个简单的类。我的类只包含一个std::vector,如下面的代码所示。我的问题是,当我按照进行时,我得到了下面描述的错误。我不知道为什么,因为我没有在任何地方定义const。你知道吗,我做错了什么 我的代码: 解决方案: 您的save()方法需要像这样声明const: void save(Archive & ar, const unsigned int version) const { ... 这将使它编译时不会出错。此外,如果您想要完整的无警告编译,
Boost
序列化一个简单的类。我的类只包含一个std::vector
,如下面的代码所示。我的问题是,当我按照进行时,我得到了下面描述的错误。我不知道为什么,因为我没有在任何地方定义const
。你知道吗,我做错了什么
我的代码:
解决方案: 您的
save()
方法需要像这样声明const
:
void save(Archive & ar, const unsigned int version) const {
...
这将使它编译时不会出错。此外,如果您想要完整的无警告编译,那么还可以将save()
中的for
循环修改为如下所示(将i
的类型从int
更改为size\t
):
因此,它希望得到一个
常量T&
。但是,它将满足于常规的T&
,因为当需要const
参数时,接受非const
。但是,它尝试将其用作常量,但没有任何效果,因为它调用的方法根本没有定义const
,因此您值得信赖的编译器非常明智,立即阻止了您:)谢谢!但我想,只有save
方法应该是const
,因为load
是const
使得无法初始化正在加载的对象的属性。@Eenoku当然100%同意并更正了。我心不在焉,匆忙地写信。我道歉。无论如何,现在答案是完整的。希望有帮助。
In file included from /usr/include/boost/serialization/extended_type_info_typeid.hpp:37,
from /usr/include/boost/archive/detail/oserializer.hpp:39,
from /usr/include/boost/archive/detail/interface_oarchive.hpp:23,
from /usr/include/boost/archive/detail/common_oarchive.hpp:22,
from /usr/include/boost/archive/basic_text_oarchive.hpp:29,
from /usr/include/boost/archive/text_oarchive.hpp:31,
from /home/martin/CLionProjects/boost_serialization_example/main.cpp:4:
/usr/include/boost/serialization/access.hpp: In instantiation of ‘static void boost::serialization::access::member_save(Archive&, T&, unsigned int) [with Archive = boost::archive::text_oarchive; T = const B]’:
/usr/include/boost/serialization/split_member.hpp:43:32: required from ‘static void boost::serialization::detail::member_saver<Archive, T>::invoke(Archive&, const T&, unsigned int) [with Archive = boost::archive::text_oarchive; T = B]’
/usr/include/boost/serialization/split_member.hpp:69:18: required from ‘void boost::serialization::split_member(Archive&, T&, unsigned int) [with Archive = boost::archive::text_oarchive; T = B]’
/home/martin/CLionProjects/boost_serialization_example/main.cpp:35:5: required from ‘void B::serialize(Archive&, unsigned int) [with Archive = boost::archive::text_oarchive]’
/usr/include/boost/serialization/access.hpp:116:9: required from ‘static void boost::serialization::access::serialize(Archive&, T&, unsigned int) [with Archive = boost::archive::text_oarchive; T = B]’
/usr/include/boost/serialization/serialization.hpp:68:22: required from ‘void boost::serialization::serialize(Archive&, T&, unsigned int) [with Archive = boost::archive::text_oarchive; T = B]’
/usr/include/boost/serialization/serialization.hpp:126:14: [ skipping 4 instantiation contexts, use -ftemplate-backtrace-limit=0 to disable ]
/usr/include/boost/archive/detail/oserializer.hpp:310:22: required from ‘static void boost::archive::detail::save_non_pointer_type<Archive>::invoke(Archive&, const T&) [with T = B; Archive = boost::archive::text_oarchive]’
/usr/include/boost/archive/detail/oserializer.hpp:534:18: required from ‘void boost::archive::save(Archive&, T&) [with Archive = boost::archive::text_oarchive; T = const B]’
/usr/include/boost/archive/detail/common_oarchive.hpp:70:22: required from ‘void boost::archive::detail::common_oarchive<Archive>::save_override(T&) [with T = const B; Archive = boost::archive::text_oarchive]’
/usr/include/boost/archive/basic_text_oarchive.hpp:83:9: required from ‘void boost::archive::basic_text_oarchive<Archive>::save_override(T&) [with T = const B; Archive = boost::archive::text_oarchive]’
/usr/include/boost/archive/detail/interface_oarchive.hpp:70:9: required from ‘Archive& boost::archive::detail::interface_oarchive<Archive>::operator<<(const T&) [with T = B; Archive = boost::archive::text_oarchive]’
/home/martin/CLionProjects/boost_serialization_example/main.cpp:107:15: required from here
/usr/include/boost/serialization/access.hpp:91:9: error: passing ‘const B’ as ‘this’ argument discards qualifiers [-fpermissive]
t.save(ar, file_version);
template<class Archive>
void save(Archive & ar, const unsigned int version){
ar & this->v->size();
for(int i = 0; i < this->v->size(); i++) {
ar & (*this->v)[i];
}
};
template<class Archive>
void load(Archive & ar, const unsigned int version) {
size_t size;
int tmp;
ar & size;
this->v = new std::vector<int>(size);
for(int i = 0; i < size; i++) {
ar & tmp;
(*this->v)[i] = tmp;
}
}
void save(Archive & ar, const unsigned int version) const {
...
for (size_t i = 0; i < this->v->size(); i++)
oa << b;
'Archive &boost::archive::detail::interface_oarchive<Archive>::operator <<<B>(const T &)'