0

编辑:创建了一个最小的 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
}

节点.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,这也可能是原因。

4

1 回答 1

0

你只声明了class Part;class Node;in Shape.h。要将类用作模板参数,编译器还需要该类的定义。在您的文件中包含Part.h和。还包括in和in 。并将一些包含守卫放入标题中:Node.hShape.hPart.hNode.hContact.hPart.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 之类的东西。

于 2014-04-06T22:24:24.577 回答