Boost序列化出现未定义类型'boost::STATIC_ASSERTION_FAILURE'错误

4

我正在学习如何使用 boost 序列化一些 C++ 类。

我有一个结构体在一个接口中。我使用 boost 序列化函数来序列化这个结构体,像这样:

Interface.h

struct X {
  const Long rate;
}

template <class Archive>     
  void serialize(Archive& ar, uint32 version)
  {
     ar & this->rate;
  }
BOOST_CLASS_EXPORT(X);   

现在这个头文件将被我的主类使用。假设是main.cpp, 这个主类的头文件是Main.h。
#include "Interface.h"
class Main {
 // some stuff

template <class Archive>
   void serialize(Archive& ar, uint32 version);

  X x;
  friend class boost::serialization::access;
};

template <class Archive>
void
Main::serialize(Archive& ar, uint32 version)
{
  ar & x;
}
BOOST_CLASS_EXPORT_KEY(Main);   

Main.cpp

BOOST_CLASS_EXPORT_IMPLEMENT(Main);

当我尝试编译此代码时,出现以下错误:
C:\ Users \ boost1470_win64_vc90sp1 \ include \ boost / archive / detail / check.hpp(162):错误C2027:使用未定义的类型“boost :: STATIC_ASSERTION_FAILURE” 具有 [ x = false ]
C:\ Users \ boost1470_win64_vc90sp1 \ include \ boost / archive / detail / iserializer.hpp(577):查看正在编译的函数模板实例化“void boost :: archive :: detail :: check_const_loading(void)” 具有 [ T = const Long ]
C:\ Users \ interfaces / Interface.h(12):查看正在编译的函数模板实例化“存档和boost :: archive :: detail :: interface_iarchive :: operator &(T&)” 具有 [ 存档= boost :: archive :: text_iarchive, T = const Long ]
C:\ Users \ interfaces / Interface.h(17):查看正在编译的类模板实例化“boost :: archive :: detail :: extra_detail :: guid_initializer” 具有 [ T = X ]
有什么想法是怎么出错了。我对boost不熟悉,正在弄清楚它是如何工作的。
注意:如果在结构中使用int而不是long,则不会看到boost :: STATIC_ASSERTION_FAILURE错误。

5
"rate" 是一个常量。反序列化如何设置它的正确值? - Alan Stokes
1
请不要使用"throw"来描述C++编译器错误,在C++中"throw"指的是异常,而不是编译器错误。 - Jonathan Wakely
这是尝试序列化到需要命名值对的存档时产生的典型错误。尝试使用此代码 ar&make_nvp(“rate”,this->rate);。文档:http://www.boost.org/doc/libs/1_59_0/libs/serialization/doc/wrappers.html#nvp,但仔细想想,Alan的评论最有可能是错误(`const_cast` 可能有所帮助)。 - alfC
1个回答

1

澄清上面的评论

struct X {
    const Long rate;
}

问题在于一旦X被实例化,速率就被设置为一个常量值,且boost无法改变它。如果将其改为以下方式阅读:
struct X {
    Long rate;
}

你的代码可行吗?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接