2013-08-21 3 views
4

Я учусь использовать boost для сериализации некоторых из моих классов на C++.Boost serialization дает неопределенный тип boost: STATIC_ASSERTION_FAILURE

У меня есть структура в интерфейсе. Я использую функцию serillize boost, чтобы сериализовать эту структуру следующим образом.

Interface.h

struct X { 
    const Long rate; 
} 

template <class Archive>  
    void serialize(Archive& ar, uint32 version) 
    { 
    ar & this->rate; 
    } 
BOOST_CLASS_EXPORT(X); 

Теперь этот заголовок будет использоваться моим основным классом. Пусть говорят main.cpp, Заголовок для этого основного класса имеет

main.h

#include "Interface.h" 
class Main { 
// some stuff 

template <class Archive> 
    void serialize(Archive& ar, uint32 version); 

    X x; 
    friend class boost::serialization::access; 
}; 

template <class Archive> 
void 
Main::serialize(Archive& ar, uint32 version) 
{ 
    ar & x; 
} 
BOOST_CLASS_EXPORT_KEY(Main); 

main.cpp

BOOST_CLASS_EXPORT_IMPLEMENT(Main); 

Когда я пытаюсь скомпилировать этот код, я получаю следующее сообщение об ошибке:

C: \ Users \ boost1470_win64_vc90sp1 \ включить \ усиление/архив/Detail/check.hpp (162): ошибка C2027: использование неопределенного типа 'подталкивание :: STATIC_ASSERTION_FAILURE' с [ х = ложь ]

C: \ Users \ boost1470_win64_vc90sp1 \ включить \ усиление/архив/Detail/iserializer.hpp (577): см ссылку на шаблон функции экземпляра Пустота подталкивание :: архив :: подробнее :: check_const_loading (аннулируются) 'компилируется с [ T = Const Long

C: \ Users \ интерфейсы/Interface.h (12): см ссылку на шаблон функции экземпляра' Архив & подталкивание :: Архив :: detail :: interface_iarchive :: оператор & (T &) 'составлен с [ архив = импульс :: архив :: text_iarchive, T = Const Long ]

C: \ Users \ интерфейсы/Interface.h (17): см ссылку на шаблон класса экземпляра «подталкивание :: архив :: подробнее :: extra_detail :: guid_initializer»компилируется с [ T = X ]

Любая идея, что происходит не так. Я новичок в развитии и выяснении того, как это работает.

Примечание: Если я использую int в struct вместо long, я не вижу ошибку boost :: STATIC_ASSERTION_FAILURE.

+5

'rate' is const. Как десериализация собирается установить правильное значение? –

+1

Пожалуйста, не используйте «throw» для описания ошибок компилятора C++, в C++ «throw» относится к исключениям, а не к ошибкам компилятора. –

+0

Это типичная ошибка, возникающая при попытке сериализации в архиве, которому нужны пары именованных значений. Попробуйте этот код 'ar & make_nvp (" rate ", this-> rate);'. Документация: http://www.boost.org/doc/libs/1_59_0/libs/serialization/doc/wrappers.html#nvp, но на секунду, хотя комментарий Алана, скорее всего, будет ошибкой ('const_cast' * может * Помогите). – alfC

ответ

1

Для уточнения комментария выше

struct X { 
    const Long rate; 
} 

проблемы, когда X конкретизируется, ставка устанавливается на постоянное значение, и повышение не может его изменить. Если вместо этого он читает

struct X { 
    Long rate; 
} 

работает ли ваш код?

Смежные вопросы