Ускоренная полимеризация регистра сериализации (экспорт) не работает для разных файлов
Я используюboost::serialization
в моем проекте. Проект большой, и сериализует мои объекты в нескольких местах. Согласнодокументация здесьЯ должен экспортировать свой класс с двумя отдельными шагами.
BOOST_EXPORT_KEY()
в.h
файл, который содержит декларацию.BOOST_EXPOET_IMPLEMENT()
в.cpp
Файл, в котором содержится экземпляр (определение) экспорта.hier.h
иерархия классов, есть 3 класса в иерархии.
/*
B <---+--- D1
|
+--- D2
*/
#include <boost/serialization/base_object.hpp>
class B {
public:
virtual ~B() {}
template < typename Ar >
void serialize(Ar& ar, const int) {
}
} ;
class D1 : public B {
public:
virtual ~D1() {}
template < typename Ar > void serialize(Ar& ar, const int) {
boost::serialization::base_object<B>(*this);
}
} ;
class D2 : public B {
public:
template < typename Ar > void serialize(Ar& ar, const int) {
boost::serialization::base_object<B>(*this);
}
virtual ~D2() {}
} ;
#include <boost/serialization/export.hpp>
BOOST_CLASS_EXPORT_KEY(B);
BOOST_CLASS_EXPORT_KEY(D1);
BOOST_CLASS_EXPORT_KEY(D2);
Иhier.cpp
содержит реализацию:
#include <boost/serialization/export.hpp>
#include "hier.h"
BOOST_CLASS_EXPORT_IMPLEMENT(D1);
BOOST_CLASS_EXPORT_IMPLEMENT(D2);
Иmain.cpp
используйте сериализацию:
#include <iostream>
#include <sstream>
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/serialization/export.hpp>
#include "hier.h"
int main(int argc, char* argv[])
{
B* d1 = new D1();
B* d2 = new D2();
std::ostringstream os;
boost::archive::text_oarchive oa (os);
oa & d1 & d2;
}
Он скомпилирован без проблем, но его запуск приведет к:
terminate called after throwing an instance of 'boost::archive::archive_exception'
what(): unregistered class - derived class not registered or exported
Что означает, что производный класс не зарегистрирован, означает, что регистрация вhier.cpp
не работает. Но это действительно странно, потому что:
Если я зарегистрирую реализацию какmain.cpp
а такжеhier.cpp
, он выпускает дублированное определение при связывании.Средства регистрации вhier.cpp
все в порядке и отображается в видимости компоновщиков.иначе не будет повторяющейся ошибки определения.
Если я зарегистрирую реализацию только вmain.cpp
, работает нормально.
Я действительно запутался в этой ситуации. Любые комментарии и предложения приветствуются. Заранее спасибо.