首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Boost类没有名为“序列化”的成员(抽象类)?

Boost类没有名为“序列化”的成员(抽象类)?
EN

Stack Overflow用户
提问于 2018-09-14 12:21:20
回答 1查看 1.4K关注 0票数 0

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

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

代码语言:javascript
复制
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看起来是这样的:

代码语言:javascript
复制
#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() {

}

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

代码语言:javascript
复制
***/boost/boost/serialization/access.hpp:116:11: error: ‘class Neuron’ has no member named ‘serialize’

我在这里做错什么了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-16 01:52:36

我认为这里的关键是“当我在其他地方使用它继承的类时”。如果我错了,请更正我(以及您的问题),但这表明您在编译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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52331909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档