Еще одна проблема с десериализацией BGL

Я пытаюсь как сериализовать, так и десериализовать данные в графическом формате. Определение моего графика следующее.

#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/directed_graph.hpp>
#include <boost/graph/adj_list_serialize.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/serialization/string.hpp>
#include <boost/serialization/binary_object.hpp>

class VFull {
public:
    VFull();
    unsigned int id, hash, year;
    std::string ip, organization;
    VFull(unsigned int id, unsigned int hash, unsigned int year, std::string ip, std::string organization);
    template<class Archive> void serialize(Archive & ar, const unsigned int version);
};

class EFull {
public:
    EFull();
    template<class Archive> void serialize(Archive & ar, const unsigned int version);
};

class GFull {
public:
    template<class Archive> void serialize(Archive & ar, const unsigned int version);
};


//Defining the graph data structure. Using the vecS specification
typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS,VFull,EFull,GFull> graph_t;
typedef boost::graph_traits<graph_t>::vertex_descriptor result_vertex_descriptor;
typedef boost::graph_traits<graph_t>::edge_descriptor result_edge_descriptor;

Мне кажется, что у меня нет проблем в процессе сериализации, в то время как у меня есть некоторые проблемы в части десериализации. На самом деле, у меня нет ошибок связывания, пока этот фрагмент кода не будет добавлен в мой источник:

#include <iomanip>
#include <iostream>
#include <fstream>
{
    std::ifstream file(path,std::ios_base::binary);
    boost::archive::binary_iarchive store{file};
    store >> graph; // Deserialization part that triggers the error
}

Я попытался прочитать некоторые вопросы здесь и прочитать руководство по Boost, но они не решили мою проблему. В частности, у меня есть эта ошибка:

Undefined symbols for architecture x86_64:
  "void EFull::serialize<boost::archive::binary_iarchive>(boost::archive::binary_iarchive&, unsigned int)", referenced from:
      void boost::serialization::access::serialize<boost::archive::binary_iarchive, EFull>(boost::archive::binary_iarchive&, EFull&, unsigned int) in boostOthers.cpp.o
  "void GFull::serialize<boost::archive::binary_iarchive>(boost::archive::binary_iarchive&, unsigned int)", referenced from:
      void boost::serialization::access::serialize<boost::archive::binary_iarchive, GFull>(boost::archive::binary_iarchive&, GFull&, unsigned int) in boostOthers.cpp.o
  "void VFull::serialize<boost::archive::binary_iarchive>(boost::archive::binary_iarchive&, unsigned int)", referenced from:
      void boost::serialization::access::serialize<boost::archive::binary_iarchive, VFull>(boost::archive::binary_iarchive&, VFull&, unsigned int) in boostOthers.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Кстати, я сериализую и десериализирую строки и целые числа без знака, "родные типы данных", которые, похоже, поддерживаются boost:

//VERTICES
VFull::VFull() { }
VFull::VFull(unsigned int i, unsigned int h, unsigned int y, std::string p, std::string o) :
    id{i}, hash{h}, year{y}, ip{p}, organization{o} {

}
template<class Archive> void VFull::serialize(Archive &ar, const unsigned int version) {
    ar & 'i'; ar &  id;
    ar &  'h'; ar & hash;
    ar & '1'; ar & ip;
    ar & '2'; ar & organization;
    ar & '3'; ar & year;
    ar & '/';
}
///////


//EDGES
EFull::EFull() { }
template<class Archive> void EFull::serialize(Archive &ar, const unsigned int version) {
    char waste = 'e';
    ar & waste; }
///////


//GRAPH SIGNATURE
template<class Archive> void GFull::serialize(Archive &ar, const unsigned int version) {
    std::string waste = "GBLS";
    ar & waste;
}
///////

РЕДАКТИРОВАТЬ Да, я связываю свой исходный код с сериализацией BGL и Boost. Это достигается с помощью этой части скрипта CMake:

find_package( Boost REQUIRED COMPONENTS graph serialization )
set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTITHREADED OFF)
INCLUDE_DIRECTORIES( ${Boost_INCLUDE_DIRS} ..some other stuff..)
TARGET_LINK_LIBRARIES(mycode ${Boost_LIBRARIES})

1 ответ

Решение

Поскольку метод сериализации является шаблоном, его следует поместить в файл.h, а не в часть.cpp.

Другие вопросы по тегам