C++ 反序列化没有默认构造函数的类型的STL容器

C++ 反序列化没有默认构造函数的类型的STL容器,c++,boost,boost-serialization,C++,Boost,Boost Serialization,我最近学习了反序列化构造函数()的模式,它将序列化用于没有默认构造函数的类型。现在,我尝试序列化这些对象的STL容器,如下例所示: #include <boost/archive/text_oarchive.hpp> #include <boost/archive/text_iarchive.hpp> #include <boost/serialization/split_member.hpp> #include <boost/serialization

我最近学习了反序列化构造函数()的模式,它将序列化用于没有默认构造函数的类型。现在,我尝试序列化这些对象的STL容器,如下例所示:

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/split_member.hpp>
#include <boost/serialization/vector.hpp>

#include <fstream>

class Point
{
public:
    Point(double x) : mX(x) {}

    template<class TArchive>
    Point(TArchive& archive)
    {
        archive >> *this;
    }

    template<class TArchive>
    void serialize(TArchive& archive, const unsigned int version)
    {
        archive & mX;
    }

    double mX;
};

int main()
{
    std::vector<Point> pointVector;
    pointVector.push_back(Point(1));
    pointVector.push_back(Point(2));

    std::ofstream outputStream("test.txt");
    boost::archive::text_oarchive outputArchive(outputStream);

    outputArchive << pointVector;
    outputStream.close();

    std::vector<Point> readPointVector;
    std::ifstream inputStream("test.txt");
    boost::archive::text_iarchive inputArchive(inputStream);
    inputArchive >> readPointVector; // Compiler error - no matching function call to Point::Point()

    return 0;
}

您可以专门指定点的向量:

template <typename Archive>
Archive& operator >> (Archive& archive, std::vector<Point>& points)
{
    points.emplace_back(archive);
    return archive;
}
模板
存档和操作员>>(存档和存档,标准::矢量和点)
{
点数。向后放置(存档);
归还档案;
}

您可以专门指定点的向量:

template <typename Archive>
Archive& operator >> (Archive& archive, std::vector<Point>& points)
{
    points.emplace_back(archive);
    return archive;
}
模板
存档和操作员>>(存档和存档,标准::矢量和点)
{
点数。向后放置(存档);
归还档案;
}

@JoachimPileborg所以这是不可能的?在这种情况下应该怎么做?确保该类型有一个默认构造函数?@JoachimPileborg,
std::vector
从未以这种方式工作过,它不要求元素是默认可构造的。构造函数只有一个调用,它是move或copy。另请参见指针类型的maybe?@stijn。我被告知在不使用指针时不要使用它(SergeyA的第一个评论:)@JoachimPileborg,所以这是不可能的?在这种情况下应该怎么做?确保该类型有一个默认构造函数?@JoachimPileborg,
std::vector
从未以这种方式工作过,它不要求元素是默认可构造的。构造函数只有一个调用,它是move或copy。另请参见指针类型的maybe?@stijn。我被告知在不使用指针时不要使用它(SergeyA的第一条评论:)甚至更好-使用
emplace
@Jarod42我想我太激动了,它编译并接受了答案。它似乎没有做正确的事情(请参见问题编辑中的新演示)?甚至更好-使用
emplace
@Jarod42我想我太激动了,它编译并接受了答案。它似乎做得不对(请参见问题编辑部分的新演示)?