Boost - 类没有名为'serialize'(抽象类)的成员?

问题描述 投票:0回答:1

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

我的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’

我在这做错了什么?

c++ serialization boost abstract-class private-members
1个回答
0
投票

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

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

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

既然你不能在neuron.h中放置Boost东西,你可能需要创建一个新的头文件,比如neuron_boost.h。这个文件将#include "neuron.h"然后提供Boost序列化所需的声明。序列化Neuron后代的源文件将包括neuron_boost.h,而其他源文件可能继续包含原始neuron.h

© www.soinside.com 2019 - 2024. All rights reserved.