2

我在 C++11 中遇到谷物问题(http://uscilab.github.io/cereal/)。

我有一个共享库,我想使用谷类库序列化它的一个类。这是库“我想序列化对象类”的一部分代码:

“对象.hpp”

class ObjectPrivate;

class Object
{
 public:
    ...
    template <class Archive>
    void load(Archive& archive);

    template <class Archive>
    void save(Archive& archive) const;

 protected: 
    std::unique_ptr<ObjectPrivate> d_ptr;
};

template<>
void Object::load<cereal::BinaryInputArchive>(cereal::BinaryInputArchive& archive);

template<>
void Object::save<cereal::BinaryOutputArchive>(cereal::BinaryOutputArchive& archive) const;

“对象.cpp”

#include"Object_p.hpp"
template <class Archive>
void Object::load(Archive& archive)
{
    archive(d_ptr);
}

template <class Archive>
void Object::save(Archive& archive) const
{
    archive(d_ptr);
}

“对象_p.hpp”

#include"Object.hpp"

class ObjectPrivate
{
 public:
    int m_id;

    template<class Archive>
    void serialize(Archive & ar)
    {
        ar(m_id);
    }
};

但我得到一个错误:

error: undefined reference to void GraphicalObject::save<cereal::BinaryOutputArchive>(cereal::BinaryOutputArchive&) const
error: undefined reference to void GraphicalObject::load<cereal::BinaryInputArchive>(cereal::BinaryInputArchive&)
4

2 回答 2

1

您声明了模板的两个特化,

template<>
void Object::load<cereal::BinaryInputArchive>(cereal::BinaryInputArchive&     archive);

template<>
void Object::save<cereal::BinaryOutputArchive>(cereal::BinaryOutputArchive& archive) const;

但你忘了实施它们。

于 2017-10-01T11:50:17.990 回答
0

CS裴是对的,我忘记了功能的实现:

template<>
void Object::load<cereal::BinaryInputArchive>(cereal::BinaryInputArchive& archive);

template<>
void Object::save<cereal::BinaryOutputArchive>(cereal::BinaryOutputArchive& archive) const;

正确的实现:

“对象.hpp”

class ObjectPrivate;

class Object
{
 public:
    ...
    template <class Archive>
    void load(Archive& archive);

    template <class Archive>
    void save(Archive& archive) const;

 protected: 
    std::unique_ptr<ObjectPrivate> d_ptr;
};

template<>
void Object::load<cereal::BinaryInputArchive>(cereal::BinaryInputArchive& archive);

template<>
void Object::save<cereal::BinaryOutputArchive>(cereal::BinaryOutputArchive& archive) const;

“对象.cpp”

#include"Object_p.hpp"
template <class Archive>
void Object::load(Archive& archive)
{
    archive(d_ptr->m_id);
}

template <class Archive>
void Object::save(Archive& archive) const
{
    archive(d_ptr->m_id);
}

template <>
void GraphicalObject::save<cereal::BinaryOutputArchive>(cereal::BinaryOutputArchive& archive) const
{
    archive(d_ptr->m_id);
}

template <>
void GraphicalObject::load<cereal::BinaryInputArchive>(cereal::BinaryInputArchive& archive)
{
    archive(d_ptr->m_id);
}

“对象_p.hpp”

#include"Object.hpp"

class ObjectPrivate
{
 public:
    int m_id;
};
于 2017-10-02T07:38:34.710 回答