Boost - class 没有名为“serialize”的成员(抽象 class)?

Boost - class has no member named ‘serialize’ (abstract class)?

我正在尝试根据这些问题连载我的摘要 class:

我的 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 headers。

我的 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() {

}

问题是,当我在别处使用其继承的 classes 时,出现错误

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

我做错了什么?

我认为这里的关键是"when I'm using its inherited classes elsewhere"。如果我错了,请纠正我(以及你的问题),但这表明你在编译 neuron.cpp.

以外的源文件时遇到编译错误

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

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

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