Boost - class 没有名为“serialize”的成员(抽象 class)?
Boost - class has no member named ‘serialize’ (abstract class)?
我正在尝试根据这些问题连载我的摘要 class:
- Error serializing an abstract class with boost
- Error serializing an abstract class with boost
我的 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()
的重载)不会改变其他翻译单元的编译方式。 (它最终可以改变一切链接在一起的方式,但我们还没有做到这一点。)如果另一个翻译单元试图序列化 Neuron
,neuron.cpp
中的内容无关紧要。编译器不知道 serialize()
的适当重载,因此在另一个源文件中序列化 Neuron
会导致侵入式序列化。也就是说,编译器会寻找Neuron
的成员函数serialize()
.
为了使 serialize()
的重载影响其他翻译单元的编译方式,需要在头文件中声明它。
由于您不能将 Boost 内容放入 neuron.h
,您可能必须创建一个新的头文件,例如 neuron_boost.h
。该文件将 #include "neuron.h"
然后提供 Boost 序列化所需的声明。序列化 Neuron
后代的源文件将包含 neuron_boost.h
而其他源文件可以继续包含原始 neuron.h
.
我正在尝试根据这些问题连载我的摘要 class:
- Error serializing an abstract class with boost
- Error serializing an abstract class with boost
我的 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()
的重载)不会改变其他翻译单元的编译方式。 (它最终可以改变一切链接在一起的方式,但我们还没有做到这一点。)如果另一个翻译单元试图序列化 Neuron
,neuron.cpp
中的内容无关紧要。编译器不知道 serialize()
的适当重载,因此在另一个源文件中序列化 Neuron
会导致侵入式序列化。也就是说,编译器会寻找Neuron
的成员函数serialize()
.
为了使 serialize()
的重载影响其他翻译单元的编译方式,需要在头文件中声明它。
由于您不能将 Boost 内容放入 neuron.h
,您可能必须创建一个新的头文件,例如 neuron_boost.h
。该文件将 #include "neuron.h"
然后提供 Boost 序列化所需的声明。序列化 Neuron
后代的源文件将包含 neuron_boost.h
而其他源文件可以继续包含原始 neuron.h
.