C++ 反序列化没有默认构造函数的类型的STL容器
我最近学习了反序列化构造函数()的模式,它将序列化用于没有默认构造函数的类型。现在,我尝试序列化这些对象的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
#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我想我太激动了,它编译并接受了答案。它似乎做得不对(请参见问题编辑部分的新演示)?