提升序列化编译错误,非常困惑

时间:2009-11-24 03:42:10

标签: c++ serialization boost

基本上好了:

我有一个简单的例子:

的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的示例正常工作。但我无法做到这一点。我四处搜索了几次,发现结果好坏参半。但我几乎是在黑暗中。

编译错误是这样的:

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,并使用boost 1.41。

有没有人有任何想法?

修改

按建议添加了包装

命名空间提升{     命名空间序列化{         模板&LT;&GT;         struct is_wrapper             :mpl :: true_         {};     } //命名空间序列化 } // namespace boost

仍会导致以下错误

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>        ]

编辑2

我在gcc上尝试了这个问题,并且它运行正常。可悲的是,我绝对需要它来使用VS2008,这是工作的标准。

3 个答案:

答案 0 :(得分:2)

你可以试试docs

  

通过一个序列化对象时   指向其基类的指针库   需要确定是否   base是抽象的(即至少有   一个虚拟功能)。图书馆   使用类型特征宏   BOOST_IS_ABSTRACT(T)这样做。不   所有编译器都支持这种类型的特征   和相应的宏。讲话   这个,宏   BOOST_SERIALIZATION_ASSUME_ABSTRACT(T)   已实施允许一个人   明确指出一个指定的   类型实际上是抽象的。这将   保证BOOST_IS_ABSTRACT会   为所有人返回正确的值   编译器。

但是,您的问题似乎与:

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

对于任何类T,默认值   的定义   提高::系列化:: is_wrapper ::值   因此是假的。

我会尝试明确专门化boost::serialization::is_wrapper<BaseTable>。毕竟,您正在通过指向基础的指针进行序列化。

最后,你的基础(BaseTable)可能需要一个序列化方法(但也许不是; boost :: serialization做一些漂亮的typeid魔法);我不确定为什么你有一个空的保存并加载它。

答案 1 :(得分:2)

我不知道您是否仍然对此问题感兴趣,但我认为问题在于您没有为serialize()函数中的基类指定nvp(名称 - 值对)。 / p>

有一个宏:

BOOST_SERIALIZATION_BASE_OBJECT_NVP(my_base_class)

检查http://www.boost.org/doc/libs/1_45_0/libs/serialization/doc/wrappers.html#nvp

答案 2 :(得分: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;

我不知道为什么会导致相同的错误消息,但我希望这可以帮助某人。