Сериализация класса с сериализуемыми вложенными классами в нем странная ошибка компиляции - PullRequest
0 голосов
/ 11 декабря 2011

Я пытаюсь изучить некоторые основы сериализации наддува.Поэтому я последовал учебнику и создал простые class A и class B и class C, в которых A a_; и B b_; находятся как частные члены.

#include <boost/serialization/serialization.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <string>
#include <fstream>

class A{
private:
        friend class boost::serialization::access;

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

        int a_;

public:
        A(){ std::cout << "A constructed" << std::endl; }
        A(int a): a_(a) { std::cout << "A constructed with 'a' ==" << a << std::endl; }
};
class B{
private:
        template<class Archive>
        void serialize(Archive & ar, const unsigned int version)
        {
                ar & b_;
        }

        std::string b_;
public:
        B(){ std::cout << "B constructed" << std::endl; }
        B(std::string b): b_(b) { std::cout << "B constructed with 'b' ==" << b << std::endl; }
};

class C{
private:
        template<class Archive>
        void serialize(Archive & ar, const unsigned int version)
        {
                ar & a_;
                ar & b_;
                ar & d_;
        }

        A a_;
        B b_;
        double d_;

public:
        C(){  std::cout << "C constructed" << std::endl; }
        C(int a, std::string b, double d ): a_(a), b_(b), d_(d) { std::cout << "C constructed with 'd' == " << d << std::endl; }
};

int main() {
    // create and open a character archive for output
    std::ofstream ofs("filename");

    // create class instance
    C c(15, "rock and roll", 25.8);

    // save data to archive
    {
            boost::archive::text_oarchive oa(ofs);
            // write class instance to archive
            oa << c;
            // archive and stream closed when destructors are called
    }

    C c_recreated;
    {
            // create and open an archive for input
            std::ifstream ifs("filename");
            boost::archive::text_iarchive ia(ifs);
            // read class state from archive
            ia >> c_recreated;
            // archive and stream closed when destructors are called
    }

    std::cin.get();
}

В IDEone live это здесь со всеми странными и страшными ошибками компилятора.В то время как на моем VS2010 я получил только 2 идентичные ошибки:

Error   2   error C2248: 'C::serialize' : cannot access private member declared in class 'C'
Error   3   error C2248: 'C::serialize' : cannot access private member declared in class 'C'    

Что я сделал не так, как я могу сделать class C сериализуемым после наличия class A и class B?

1 Ответ

3 голосов
/ 11 декабря 2011

Вы не friend class boost::serialization::access; для B и C.

...