Ошибка библиотеки зерновых с использованием enable_shared_from_this

РЕДАКТИРОВАТЬ: Создано минимальное 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.

У меня есть следующая структура кода (некоторые части, такие как include guard или несвязанный код, были опущены, я, конечно, могу предоставить все это при необходимости, но я хотел бы сделать его как можно более коротким):

Shape.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);
}
};

Shape.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);
}
};

node.cpp:

#include "Node.h"#include "Part.h"
Node::Node() {
}

Node::Node(std::vector<PartPtr> parts, NodePtr parent) : parts(parts), parent(parent) {
// code omitted
}

Part.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);
}
};

Part.cpp:

#include "Part.h"#include "Contact.h"
Part::Part() {
}

Part::Part(double diameter) {
// omitted code
}

Класс Contact содержит PartPtr в качестве переменной-члена, PointCloud содержит просто набор данных Eigen :: Matrix (вероятно, должен быть также и умным указателем, чтобы ускорить код, но это не должно быть важно для этой проблемы).

Любые предложения, как это исправить? Или это может быть ошибка? Я использую VS2013, что также может быть причиной.

0

Решение

Вы только что объявили class Part;а также class Node; в Shape.h, Чтобы использовать класс в качестве параметра шаблона, компилятору также необходимо определить этот класс.
Включают Part.h а также Node.h в вашем Shape.h файл. Также включить Part.hв Node.h а также Contact.h в Part.h,
И вставьте некоторые заголовки в заголовки:

#ifndef SOME_UNIQUE_IDENTIFIER
#define SOME_UNIQUE_IDENTIFIER

// content of your header goes here

#endif

SOME_UNIQUE_IDENTIFIER обычно будет выглядеть как NODE_H в вашем файле Node.h и PART_H в вашем файле Part.h.

0

Другие решения

Других решений пока нет …