10

我有一个要序列化的模板类(称为 C),我想为它指定一个用于提升序列化的版本。由于 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 的后续调用会给出以下错误:

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

正确的方法是什么?

4

3 回答 3

13
#include <boost/serialization/version.hpp>

:-)

于 2008-09-17T14:06:44.533 回答
1

我能够正确使用宏 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 移至全局范围解决了该问题。我宁愿保持宏接近引用的结构。

于 2016-06-06T14:33:47.803 回答
0

为避免您的库过早依赖 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 标头。

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

于 2021-11-28T11:44:10.580 回答