2013-04-21 15 views
6

Sto provando ad integrare la serializzazione nel mio codice. Tuttavia, ottengo l'errore "non ha un membro chiamato". Il libro che sto leggendo dice che std :: pair non ha bisogno di un file header da includere e non esiste. Come risolvere questo errore? mio aspetto codice come questo:'struct std :: pair <int, int>' non ha un membro chiamato 'serialize'

#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; 
} 
+4

'std :: pair' è definito in' '. –

risposta

14

Aggiungi #include <boost/serialization/utility.hpp> per consentire std::pair serializzazione.

1

Perché std::pair fornire una funzione serialize? Lo standard non lo dice mai. È anche errato dire che non ha bisogno di un file di intestazione: richiede veramente l'utilità <. È, tuttavia, probabilmente già incluso da un altro file di intestazione che usi.

È possibile fornire la propria funzione serialize. Boost fornisce già esempi. Nel tuo caso, devi aggiungere il seguente codice prima di 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 

Tra l'altro, non vedo la necessità di utilizzare string s nel codice. È possibile rimuovere quella linea e basta usare:

std::stringstream ss; 
+5

Il codice di serializzazione della coppia è in "", non è necessario scriverne uno proprio. –

+0

Non funzionerà con gli archivi xml. Dovresti usare 'make_nvp'. –

Problemi correlati