2009-11-24 2 views
1

Хорошо так в основном:подталкивания Сериализация ошибки компиляции, ужасно смущен

у меня есть этот простой пример:

main.cpp

using namespace VHGO::Resource; 

std::list<BaseTable*> tableList; 

BigTable* bt1 = new BigTable(); 
HRESULT hr = S_OK; 
hr = bt1->Add(L"TEXTURE", L"..\\Data\\ground.png"); 
tableList.push_back(bt1); 

std::wofstream ofs3(L"VHGOSatData.bif"); 
boost::archive::xml_woarchive outArch3(ofs3); 
outArch3 & BOOST_SERIALIZATION_NVP(tableList); 

И мои классы сериализации

namespace VHGO 
{ 
typedef std::wstring String; 
typedef std::map<VHGO::String, VHGO::String> PropertyMap; 
    namespace Resource 
    { 
     class BaseTable 
     { 
      friend class boost::serialization::access; 
      friend std::wostream& operator<<(std::wostream& os, const BaseTable& b); 
     private: 
      template<class Archive> 
      void save(Archive& ar, const unsigned int version) const {} 

      template<class Archive> 
      void load(Archive& ar, const unsigned int version) {} 
     public: 
      BaseTable() 
      { 
      } 
      //for boost 
      virtual ~BaseTable() 
      { 
      } 

      virtual HRESULT Add(__in const VHGO::String&, __in const VHGO::String&) = 0; 
      virtual HRESULT Remove(__in const VHGO::String&) = 0; 
      virtual HRESULT Get(__in const VHGO::String&, __out VHGO::String&) = 0; 
     }; 

     std::wostream& operator<<(std::wostream& os, const BaseTable& b) 
     { 
      UNREFERENCED_PARAMETER(b); 
      return os; 
     } 
     ////////////////////////////////////////////////////////////////////////////////////////// 

     class BigTable : public BaseTable 
     { 
      friend class boost::serialization::access; 

     private: 
      VHGO::PropertyMap m_Values; 
      template<class Archive> 
      void serialize(Archive& ar, const unsigned int version) 
      { 
       boost::serialization::split_member(ar, *this, version); 
      } 


      template<class Archive> 
      void save(Archive& ar, const unsigned int version) const 
      { 
       UNREFERENCED_PARAMETER(version); 
       ar << boost::serialization::base_object<const VHGO::Resource::BaseTable>(*this); 
       ar << boost::serialization::make_nvp("bigtable", m_Values); 

      } 

      template<class Archive> 
      void load(Archive& ar, const unsigned int version) 
      { 
       UNREFERENCED_PARAMETER(version); 
       ar >> boost::serialization::base_object<BaseTable>(*this); 
       ar >> boost::serialization::make_nvp("bigtable", m_Values); 
      } 

      // BOOST_SERIALIZATION_SPLIT_MEMBER() 

     public: 
      BigTable(__in const VHGO::PropertyMap& propMap) 
       : m_Values(propMap) 
      { 

      } 

      BigTable() 
      { 

      } 

      virtual ~BigTable() 
      { 

      } 
      HRESULT Add(__in const VHGO::String& propKey, __in const VHGO::String& propValue) 
      { 
       //itadds 

     return S_OK; 
      } 

      HRESULT Remove(__in const VHGO::String& propKey) 
      { 
       /*insertchecking*/ 
       return S_OK; 
      } 

      HRESULT Get(__in const VHGO::String& key, __out VHGO::String& aValue) 
      { 
       aValue = m_Values[key]; 
       return S_OK; 
      } 

      VHGO::PropertyMap GetPropertyMap() 
      { 
       return m_Values; 
      } 
     }; 

Что является причиной этого, ив прошел через документы, и я могу сделать примеры boost k штраф. Но я не могу сделать эту работу. Я искал вокруг, несколько раз и нашел смешанные результаты. Но я в значительной степени в темноте.

Ошибка компиляции заключается в следующем:

Error 1 error C2664: 'boost::mpl::assertion_failed' : cannot convert parameter 1 from 'boost::mpl::failed ************boost::serialization::is_wrapper<T>::* ***********' to 'boost::mpl::assert<false>::type' 

им с помощью VC9.0, и используя подталкивание 1,41.

Есть ли у кого-нибудь идеи?

EDIT

Добавлено обертка, как предложено

имен подталкивание { имен сериализации { шаблон <> структура is_wrapper : MPL :: true_ {}; } // пространство имен сериализации } // пространство имен подталкивание

Тем не менее, приводит к следующей ошибке

1>d:\wrkspace\Sources\External\boost\boost/archive/basic_xml_oarchive.hpp(87) : error C2664: 'boost::mpl::assertion_failed' : cannot convert parameter 1 from 'boost::mpl::failed ************boost::serialization::is_wrapper<T>::* ***********' to 'boost::mpl::assert<false>::type' 
1>  with 
1>  [ 
1>   T=const std::list<VHGO::Resource::BaseTable *> 
1>  ] 
1>  No constructor could take the source type, or constructor overload resolution was ambiguous 
1>  d:\wrkspace\Sources\External\boost\boost/archive/detail/interface_oarchive.hpp(64) : see reference to function template instantiation 'void boost::archive::basic_xml_oarchive<Archive>::save_override<T>(T &,int)' being compiled 
1>  with 
1>  [ 
1>   Archive=boost::archive::xml_woarchive, 
1>   T=std::list<VHGO::Resource::BaseTable *> 
1>  ] 

EDIT 2

я сдалась и попытался это на НКУ, и она отлично работает. К сожалению, мне абсолютно необходимо, чтобы он работал на VS2008, который является стандартом на работе.

+0

Вы посмотрели исходный код форсирования вокруг неудавшегося утверждения? Когда у меня было утверждение в библиотеке сериализации boost, был хороший комментарий, который объяснил, что я делаю неправильно. – Eld

+0

Скудно, похоже, ничего ценного. :( Я схожу с ума сойти с ума. – UberJumper

+0

Похоже, эта часть повышения просто не работает с вашим компилятором. Попробуйте список рассылки boost? Вы также можете попробовать последнюю версию (или даже версию), если у вас еще нет. –

ответ

2

Вы могли бы попробовать, из docs:

При сериализации объекта через указатель на его базовый класс, библиотека необходимо определить, является ли база является абстрактным (т.е. имеет, по крайней мере, одна виртуальная функция). В библиотеке используется макрос типа типа BOOST_IS_ABSTRACT(T). Not все компиляторы поддерживают этот тип trait и соответствующий макрос. Для адресации это макрос BOOST_SERIALIZATION_ASSUME_ABSTRACT(T) был реализован, чтобы разрешить до явно указать, что указанный тип на самом деле является абстрактным. Это будет guarentee, что BOOST_IS_ABSTRACT будет вернуть правильное значение для всех компиляторов.

Однако, ваша проблема, кажется, связана с:

namespace boost { 
namespace serialization { 
template<class T> 
struct is_wrapper 
: public mpl::false_ 
{}; 
} // namespace serialization 
} // namespace boost 

Для любого класса Т, по умолчанию определения Повысьте :: сериализации :: is_wrapper :: Значение таким образом ложно.

Я бы попробовал, специализирующихся на boost::serialization::is_wrapper<BaseTable>. В конце концов, вы сериализуете указатель на базу.

Наконец, вашей базе (BaseTable) может понадобиться метод сериализации (но, возможно, нет; boost :: serialization выполняет некоторую изящную магию типа); Я не уверен, почему у вас есть пустое сохранение и загрузка.

2

Я не знаю, интересует ли вас эта проблема, но я думаю, что проблема заключается в том, что вы не указываете nvp (пара значений имен) для базового класса в вашей функции serialize().

Существует макрос для этого:

BOOST_SERIALIZATION_BASE_OBJECT_NVP(my_base_class) 

Проверить http://www.boost.org/doc/libs/1_45_0/libs/serialization/doc/wrappers.html#nvp.

0

Я получил такое же сообщение об ошибке в Visual Studio 2008. Как ни странно, я решил проблему, удалив const перед сериализацией переменной (я в нее вставлял ее по ошибке). Смотрите ниже:

template<class Archive> 
inline void load_construct_data(Archive & ar, myClass * t, const unsigned int file_version) 
{ 
    const std::map<std::wstring, std::wstring> data; 
    ar >> _data; 

    ::new(t)myClass(_data); 
} 

выше должны иметь первую строку в функции заменены:

std::map<std::wstring, std::wstring> data; 

Я не знаю, как, почему это может вызвать такое же сообщение об ошибке, но я надеюсь, что это помогает кто то.

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