/ / 'struct std :: pair <int, int>' nie ma członka o nazwie „serialize” - c ++, serializacja, boost

'struct std :: pair <int, int>' nie ma członka o nazwie "serialize" - c ++, serializacja, boost

Próbuję zintegrować serializację z moimkod. Jednak pojawia się błąd „nie ma członka o nazwie”. Książka, którą czytam, mówi, że std :: pair nie potrzebuje pliku nagłówkowego, aby go załączyć i nie istnieje. Jak naprawić ten błąd? Mój kod wygląda następująco:

#include <iostream>
//ofstream/ifstream
#include <fstream>

#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
//stringstream
#include <sstream>
//
#include <boost/serialization/complex.hpp>
#include <boost/serialization/bitset.hpp>
//#include <boost/serialization/

//BOOST_BINARY
#include <boost/utility/binary.hpp>

using namespace std;

int main()
{
complex<double> c(1,0);
bitset<3> b(BOOST_BINARY(101));
pair<int,int> p(1,2);
string s;
std::stringstream ss(s);
boost::archive::text_oarchive oa(ss);
oa<<c<<b<<p;
{
complex<double> c;
bitset<3> b;
pair<int,int> p;
boost::archive::text_iarchive ia(ss);
ia>>c>>b>>p;
}
return 0;
}

Odpowiedzi:

16 dla odpowiedzi nr 1

Dodaj #include <boost/serialization/utility.hpp> umożliwić std::pair serializacja.


0 dla odpowiedzi nr 2

Dlaczego powinieneś std::pair zapewnić serialize funkcjonować? Standard nigdy tego nie mówi. Błędne jest również twierdzenie, że nie potrzebuje pliku nagłówka: tak naprawdę wymaga <utility>. Prawdopodobnie jest to już zawarte w innym pliku nagłówkowym, którego używasz.

Możesz podać własne serialize funkcjonować. Boost już zawiera przykłady. W twoim przypadku musisz wcześniej dodać następujący kod main.

namespace boost {
namespace serialization {

template <class Archive, typename T1, typename T2>
void serialize(Archive& ar, std::pair<T1, T2>& pr, const unsigned int version)
{
ar & pr.first;
ar & pr.second;
}

} // namespace serialization
} // namespace boost

Nawiasem mówiąc, nie widzę potrzeby używania string s w twoim kodzie. Możesz usunąć tę linię i po prostu użyć:

std::stringstream ss;