我正在尝试根据这些问题序列化我的抽象类:
我的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.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
。