boost::shared_ptr‹Type› не сериализует данные и выдает ошибку

У меня снова возникла проблема при сериализации общего указателя с использованием boost, и ниже приведен код:

//Файл Content.hpp

#include <boost/serialization/string.hpp>
#include <boost\serialization\shared_ptr.hpp>
#include <boost/serialization/list.hpp>


struct Content
    {

        std::string type;
    boost::shared_ptr<Content> mycontent;  // mycontent is of type Content


    private:
        friend class boost::serialization::access;
        template<class Archive>
        void serialize(Archive &ar, const unsigned int version)
        {
            ar & id;
            ar & name;
        ar & mycontent;
        }   

    public:
        Content(void);
        Content(const parameter_strings & parms);

        ~Content(void);
    };

// файл Content.cpp

Content::Content(void)
{
}

Content::~Content(void)
{
}

Content::Content(const parameter_strings & parms)
{
   // implementation part
}

если я прокомментирую строку " -- boost::shared_ptr mycontent; --" она компилируется без ошибок, но мне нужно использовать shared_ptr и, следовательно, выдает ошибку:

выдает ошибку: ошибка C4308: отрицательная интегральная константа преобразована в тип без знака

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


person sia    schedule 26.03.2014    source источник
comment
возможный дубликат сбой ускоренной сериализации - выдает ошибку времени компиляции C4308   -  person sehe    schedule 26.03.2014


Ответы (1)


Я уже ответил на это в комментариях здесь:

@user3382670 user3382670 делает деструктор виртуальным включенным RTTI для вашего класса. Это означает, что typeid(variable) вернет правильный тип времени выполнения (наиболее производный класс) insetad статически известного типа с указателями и ссылками. — сехе

Кроме того, поскольку вам не нужен полиморфизм, такой проблемы быть не должно: см. Прямой эфир на Coliru

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

struct Content
{
    std::string id, name;
    boost::shared_ptr<Content> mycontent;

  private:
    friend class boost::serialization::access;
    template<class Archive>
        void serialize(Archive &ar, const unsigned int /*version*/)
        {
            ar & id;
            ar & name;
            ar & mycontent;
        }   

  public:
    Content() {}
    typedef int parameter_strings;
    Content(const parameter_strings & parms) { }

    ~Content() {}
};

int main()
{
    boost::archive::text_oarchive ao(std::cout);

    Content x;
    ao << x;
}
person sehe    schedule 26.03.2014
comment
я попробовал приведенный выше код.. но все еще существует та же проблема.. должен ли я сделать свой деструктор не виртуальным?? - person sia; 26.03.2014