編集: エラーを簡単に再現できるように最小限の VS ソリューションを作成しました: https://www.dropbox.com/s/pk0t8t2xykjmtc5/test%20cereal%20this.zip ($(LIBSROOT) の代わりにインクルードにシリアルを追加します。それを持っている)。
デフォルトのコンストラクターがないことを示す 2 つのエラーが表示されます。
error C2139: 'Node' : an undefined class is not allowed as an argument to compiler intrinsic type trait '__is_constructible'
error C2338: Trying to serialize a an object with no default constructor.
<path>\cereal\details\traits.hpp line 1248
しかし、クラスのデフォルトのコンストラクターは問題ないと思います。Node クラス変数のシリアル化をコメント アウトすると、同じエラーが発生しますが、Part クラス変数で発生します。
次のコード構造があります (インクルード ガードや無関係なコードなどの一部は省略されています。もちろん、必要に応じてすべてを提供できますが、できるだけ短くしたかったのです)。
シェイプ.h:
#include <cereal/types/memory.hpp>
#include <cereal/types/vector.hpp>
#include <string>
class Part;
typedef std::shared_ptr<Part> PartPtr;
class Node;
typedef std::shared_ptr<Node> NodePtr;
class Shape {
private:
std::vector<PartPtr> parts;
NodePtr root;
std::vector<std::vector<NodePtr>> levels;
public:
Shape();
Shape(std::string fileName);
template <class Archive>
void serialize(Archive & ar) {
ar(parts, levels, root);
}
};
シェイプ.cpp:
#include "Shape.h"
#include "Node.h"
#include "Part.h"
Shape::Shape() {
}
Shape::Shape(std::string fileName) {
// omitted code
}
Node.h:
#include "PointCloud.h"
#include <cereal/types/vector.hpp>
#include <cereal/types/memory.hpp>
class Part;
typedef std::shared_ptr<Part> PartPtr;
class Node;
typedef std::shared_ptr<Node> NodePtr;
class Node : public std::enable_shared_from_this<Node> {
private:
std::vector<PartPtr> parts;
NodePtr parent;
PointCloud pointCloud;
public:
Node();
Node(std::vector<PartPtr> parts, NodePtr parent);
template <class Archive>
void serialize(Archive & ar) {
ar(parts, parent, pointCloud);
}
};
ノード.cpp:
#include "Node.h"
#include "Part.h"
Node::Node() {
}
Node::Node(std::vector<PartPtr> parts, NodePtr parent) : parts(parts), parent(parent) {
// code omitted
}
パート.h:
#include "PointCloud.h"
#include <cereal/types/memory.hpp>
#include <cereal/types/vector.hpp>
class Contact;
class Part;
typedef std::shared_ptr<Contact> ContactPtr;
typedef std::shared_ptr<Part> PartPtr;
class Part : public std::enable_shared_from_this<Part> {
private:
PointCloud pointCloud;
std::vector<ContactPtr> contacts;
public:
Part();
Part(double diameter);
template <class Archive>
void serialize(Archive & ar) {
ar(pointCloud, contacts);
}
};
パート.cpp:
#include "Part.h"
#include "Contact.h"
Part::Part() {
}
Part::Part(double diameter) {
// omitted code
}
Contact クラスにはメンバー変数として PartPtr が含まれ、PointCloud には一連の Eigen::Matrix データのみが含まれます (コードを高速化するために、おそらくスマート ポインターも必要ですが、この問題では重要ではありません)。
これを修正する方法はありますか?それともバグである可能性がありますか?私はVS2013を使用していますが、これも原因である可能性があります。