Здравствуйте, Sergey, Вы писали:
S>k732 пишет:
>> Ну пусть хоьб 1 раз. Но проблемма в шаблонном классе. Можно ли ее
>> разрешить ?
S>Попробуй ченить в таком роде:
S>S>namespace boost { namespace serialization {
S>template<typename T, unsigned int X> struct version<Averager<T, X> >
S>{
S> typedef mpl::int_<20> type;
S> typedef mpl::integral_c_tag tag;
S> BOOST_STATIC_CONSTANT(unsigned int, value=version::type::value);
S>};
S>}}
S>
S>Не знаю, на кой ляд там mpl-ные штуки, наверное можно написать просто
S>S>namespace boost { namespace serialization {
S>template<typename T, unsigned int X> struct version<Averager<T, X> >
S>{
S> enum { value = 20};
S>};
S>}}
S>
большое тебе человеческое. Вроде сработало
Правда не совсем понятно зачем так сложно пришлось и что это означает (в смысле объяснения)
k732 пишет:
> S>namespace boost { namespace serialization {
> S>template<typename T, unsigned int X> struct version<Averager<T, X> >
> S>{
> S> typedef mpl::int_<20> type;
> S> typedef mpl::integral_c_tag tag;
> S> BOOST_STATIC_CONSTANT(unsigned int, value=version::type::value);
> S>};
> S>}}
> S>
>
>
>
> S>Не знаю, на кой ляд там mpl-ные штуки, наверное можно написать просто
> S>
>
> S>namespace boost { namespace serialization {
> S>template<typename T, unsigned int X> struct version<Averager<T, X> >
> S>{
> S> enum { value = 20};
> S>};
> S>}}
> S>
>
>
>
> большое тебе человеческое. Вроде сработало
> Правда не совсем понятно зачем так сложно пришлось и что это означает (в
> смысле объяснения)
Ну вообще если посмотреть в файл version.hpp, то там написано:
namespace boost {
namespace serialization {
struct basic_traits;
// default version number is 0. Override with higher version
// when class definition changes.
template<class T>
struct version
{
template<class U>
struct traits_class_version {
typedef BOOST_DEDUCED_TYPENAME U::version type;
};
typedef mpl::integral_c_tag tag;
// note: at least one compiler complained w/o the full qualification
// on basic traits below
typedef
BOOST_DEDUCED_TYPENAME mpl::eval_if<
is_base_and_derived<boost::serialization::basic_traits,T>,
traits_class_version<T>,
mpl::int_<0>
>::type type;
BOOST_STATIC_CONSTANT(unsigned int, value = version::type::value);
};
} // namespace serialization
} // namespace boost
Означает это, как и написано в комменте, что по дефолту версия равна 0.
Т.е., выражение boost::serialization::version<some_type>::value имеет
значение 0, если не определена соответствующая специализация. Макрос
#define BOOST_CLASS_VERSION(T, N) \
namespace boost { \
namespace serialization { \
template<> \
struct version<T > \
{ \
typedef mpl::int_<N> type; \
typedef mpl::integral_c_tag tag; \
BOOST_STATIC_CONSTANT(unsigned int, value = version::type::value); \
}; \
} \
}
как раз и определяет такую специализацию. Соответственно, чтобы задать
версию для шаблона, можно написать частичную специализацию структуры
version — это код который я приводил в прошлый раз.
Зачем нужны typedef mpl::int_<N> type; и typedef mpl::integral_c_tag
tag; — понятия не имею, предполагаю что низачем.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, Sergey, Вы писали:
S>k732 пишет:
>> S>namespace boost { namespace serialization {
>> S>template<typename T, unsigned int X> struct version<Averager<T, X> >
>> S>{
>> S> typedef mpl::int_<20> type;
>> S> typedef mpl::integral_c_tag tag;
>> S> BOOST_STATIC_CONSTANT(unsigned int, value=version::type::value);
>> S>};
>> S>}}
>> S>
>>
>>
>>
>> S>Не знаю, на кой ляд там mpl-ные штуки, наверное можно написать просто
>> S>
>>
>> S>namespace boost { namespace serialization {
>> S>template<typename T, unsigned int X> struct version<Averager<T, X> >
>> S>{
>> S> enum { value = 20};
>> S>};
>> S>}}
>> S>
>>
>>
>>
>> большое тебе человеческое. Вроде сработало
>> Правда не совсем понятно зачем так сложно пришлось и что это означает (в
>> смысле объяснения)
S>Ну вообще если посмотреть в файл version.hpp, то там написано:
S>S>namespace boost {
S>namespace serialization {
S>struct basic_traits;
S>// default version number is 0. Override with higher version
S>// when class definition changes.
S>template<class T>
S>struct version
S>{
S> template<class U>
S> struct traits_class_version {
S> typedef BOOST_DEDUCED_TYPENAME U::version type;
S> };
S> typedef mpl::integral_c_tag tag;
S> // note: at least one compiler complained w/o the full qualification
S> // on basic traits below
S> typedef
S> BOOST_DEDUCED_TYPENAME mpl::eval_if<
S> is_base_and_derived<boost::serialization::basic_traits,T>,
S> traits_class_version<T>,
S> mpl::int_<0>
>>::type type;
S> BOOST_STATIC_CONSTANT(unsigned int, value = version::type::value);
S>};
S>} // namespace serialization
S>} // namespace boost
S>
S>Означает это, как и написано в комменте, что по дефолту версия равна 0.
S>Т.е., выражение boost::serialization::version<some_type>::value имеет
S>значение 0, если не определена соответствующая специализация. Макрос
S>S>#define BOOST_CLASS_VERSION(T, N) \
S>namespace boost { \
S>namespace serialization { \
S>template<> \
S>struct version<T > \
S>{ \
S> typedef mpl::int_<N> type; \
S> typedef mpl::integral_c_tag tag; \
S> BOOST_STATIC_CONSTANT(unsigned int, value = version::type::value); \
S>}; \
S>} \
S>}
S>
S>как раз и определяет такую специализацию. Соответственно, чтобы задать
S>версию для шаблона, можно написать частичную специализацию структуры
S>version — это код который я приводил в прошлый раз.
S>Зачем нужны typedef mpl::int_<N> type; и typedef mpl::integral_c_tag
S>tag; — понятия не имею, предполагаю что низачем.
еще раз спасибо