提升 - 类没有名为"序列化"的成员(抽象类)?



我正在尝试根据以下问题序列化我的抽象类:

  • 获取私有数据成员以进行非侵入式提升序列化C++
  • 使用 boost 序列化抽象类时出错
  • 使用 boost 序列化抽象类时出错

我的neuron.h如下所示:

class Neuron {
public:
struct access;
API virtual ~Neuron();
API virtual double activate( double x, double b ) = 0;
};

我必须将所有Boost相关的成员保留在neuron.cpp中,以防止在其他一些代码中使用 Boost 标头时包含neuron.h

我的neuron.cpp如下所示:

#include "Neuron.h"
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
BOOST_SERIALIZATION_ASSUME_ABSTRACT(Neuron);
struct Neuron :: access {
template <class Archive>
static void serialize(Archive &ar, Neuron& n, const unsigned int version) {}
};
namespace boost {
namespace serialization {
template<class Archive>
void serialize(Archive & ar, Neuron& n, const unsigned int version)
{
Neuron::access::serialize(ar, n, version);
}
} // namespace serialization
} // namespace boost
Neuron::~Neuron() {
}

问题是,当我在其他地方使用它继承的类时,我得到错误

***/boost/boost/serialization/access.hpp:116:11: error: ‘class Neuron’ has no member named ‘serialize’

我在这里做错了什么?

我认为这里的关键是"当我在其他地方使用它继承的类时"。如果我错了,请纠正我(以及您的问题(,但这表明您在编译neuron.cpp以外的源文件时出现编译错误。

考虑到编译器必须使用的内容,这是有道理的。您可能已经注意到,对一个源文件的更改往往不需要重新编译其他源文件。因此,向neuron.cpp添加一些东西(例如serialize()的重载(不会改变其他翻译单元的编译方式。(它最终可以改变所有东西链接在一起的方式,但我们还没有做到这一点。如果另一个翻译单元试图序列化Neuronneuron.cpp中的东西无关紧要。编译器不知道serialize()的适当重载,因此在另一个源文件中序列化Neuron会导致侵入性序列化。也就是说,编译器将查找名为serialize()Neuron成员函数。

为了使serialize()重载影响其他翻译单元的编译方式,需要在头文件中声明它。

由于您不能将Boost内容放入neuron.h,因此您可能需要创建一个新的头文件,例如neuron_boost.h。然后,此文件将#include "neuron.h"提供 Boost 序列化所需的声明。序列化Neuron后代的源文件将包含neuron_boost.h,而其他源文件可以继续包含原始neuron.h

最新更新