Ускоренная полимеризация регистра сериализации (экспорт) не работает для разных файлов

Я использую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, работает нормально.

Я действительно запутался в этой ситуации. Любые комментарии и предложения приветствуются. Заранее спасибо.

Ответы на вопрос(1)

Ваш ответ на вопрос