我试图根据以下问题序列化我的抽象类:
我的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’我在这里做错什么了?
发布于 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。
https://stackoverflow.com/questions/52331909
复制相似问题