【问题标题】:Boost - class has no member named ‘serialize’ (abstract class)?Boost - 类没有名为“序列化”的成员(抽象类)?
【发布时间】:2019-02-19 06:19:04
【问题描述】:

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

我的neuron.h 看起来像这样:

class Neuron {

public:

    struct access;

    API virtual ~Neuron();

    API virtual double activate( double x, double b ) = 0;

};

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

我的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::access::serialize(ar, n, version);调用未实现的神经元的序列化。您必须精确指定 n 的序列化方式。
  • @Pi 所以,serialize 函数在 access 结构中实现。我试图关注第一个问题中给出的the example
  • 是的,但在示例中它说 `ar & BOOST_SERIALIZATION_NVP(a.m_id);` 这是序列化成员数据的具体方式。你没有对等的
  • @Pi 是的,但是我没有要在这个抽象类中序列化的成员(它目前只是一组方法) - 我正在实现它,以便继承的类可以调用它。
  • @Pi 或者你认为有什么特殊的方法可以创建一个空的序列化函数?

标签: c++ serialization boost abstract-class private-members


【解决方案1】:

我认为这里的关键是“当我在别处使用它的继承类时”。如果我错了,请纠正我(以及您的问题),但这表明您在编译 neuron.cpp 以外的源文件时遇到了编译错误。

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

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

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

【讨论】:

  • 我已经设法摆脱了上述错误,而无需将 serialize 函数移动到另一个标题。有趣的是,同样的错误出现在代码的不同部分。我已尝试在EDIT 部分的回答中描述所有重要细节。
猜你喜欢
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-01
  • 2018-02-02
相关资源
最近更新 更多