Boost序列化:指定模板类版本

发布于 2024-07-05 14:33:35 字数 585 浏览 8 评论 0原文

我有一个序列化的模板类(称之为 C),我想为其指定一个用于 boost 序列化的版本。 由于 BOOST_CLASS_VERSION 不适用于模板类。 我尝试了这个:

namespace boost {
namespace serialization {
    template< typename T, typename U >
    struct version< C<T,U> >
    {
        typedef mpl::int_<1> type;
        typedef mpl::integral_c_tag tag;
        BOOST_STATIC_CONSTANT(unsigned int, value = version::type::value);
    };
}
}

但它无法编译。 在 VC8 下,对 BOOST_CLASS_VERSION 的后续调用会出现以下错误:

错误 C2913:显式专业化; 'boost::serialization::version' 不是类模板的特化

正确的方法是什么?

I have a template class that I serialize (call it C), for which I want to specify a version for boost serialization. As BOOST_CLASS_VERSION does not work for template classes. I tried this:

namespace boost {
namespace serialization {
    template< typename T, typename U >
    struct version< C<T,U> >
    {
        typedef mpl::int_<1> type;
        typedef mpl::integral_c_tag tag;
        BOOST_STATIC_CONSTANT(unsigned int, value = version::type::value);
    };
}
}

but it does not compile. Under VC8, a subsequent call to BOOST_CLASS_VERSION gives this error:

error C2913: explicit specialization; 'boost::serialization::version' is not a specialization of a class template

What is the correct way to do it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

用心笑 2024-07-12 14:33:36

为了避免您的库过早依赖于 Boost.Serialization,您可以转发声明:

namespace boost {
namespace serialization {

template<typename T> struct version;

}  // end namespace serialization
}  // end namespace boost

而不是包含标头。
要声明类的版本,您可以执行以下操作:

namespace boost {
namespace serialization {
template<typename T, int D, class A>
struct version< your_type<T, D, A> > {
    enum { value = 16 };
};
}  // end namespace serialization
}  // end namespace boost

由于它不使用 BOOST_CLASS_VERSION 宏,因此仍然不需要提前包含 Boost.Serialization 标头。

(出于某种原因,在 C++14 中,static const [constexpr] unsigned int value = 16; 对我不起作用)。

To avoid premature dependency of your library on Boost.Serialization you can forward declare:

namespace boost {
namespace serialization {

template<typename T> struct version;

}  // end namespace serialization
}  // end namespace boost

Instead of including the header.
To declare the version of you class you can do:

namespace boost {
namespace serialization {
template<typename T, int D, class A>
struct version< your_type<T, D, A> > {
    enum { value = 16 };
};
}  // end namespace serialization
}  // end namespace boost

Since it doesn't use the BOOST_CLASS_VERSION macro still doesn't need premature inclusion of the Boost.Serialization headers.

(for some reason static const [constexpr] unsigned int value = 16; doesn't work for me, in C++14).

姜生凉生 2024-07-12 14:33:36

我能够正确使用宏 BOOST_CLASS_VERSION 直到我将其封装在命名空间中。 返回的编译错误是:

error C2988: unrecognizable template declaration/definition
error C2143: syntax error: missing ';' before '<'
error C2913: explicit specialization; 'Romer::RDS::Settings::boost::serialization::version' is not a specialization of a class template
error C2059: syntax error: '<'
error C2143: syntax error: missing ';' before '{'
error C2447: '{': missing function header (old-style formal list?)

正如之前编辑中所建议的,将 BOOST_CLASS_VERSION 移动到全局范围解决了该问题。 我更喜欢使宏保持接近引用的结构。

I was able to properly use the macro BOOST_CLASS_VERSION until I encapsulated it inside a namespace. Compilation errors returned were:

error C2988: unrecognizable template declaration/definition
error C2143: syntax error: missing ';' before '<'
error C2913: explicit specialization; 'Romer::RDS::Settings::boost::serialization::version' is not a specialization of a class template
error C2059: syntax error: '<'
error C2143: syntax error: missing ';' before '{'
error C2447: '{': missing function header (old-style formal list?)

As suggested in a previous edit, moving BOOST_CLASS_VERSION to global scope solved the issue. I would prefer keeping the macro close to the referenced structure.

单挑你×的.吻 2024-07-12 14:33:35
#include <boost/serialization/version.hpp>

:-)

#include <boost/serialization/version.hpp>

:-)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文