基本上好了:
我有一个简单的例子:
的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,这是工作的标准。
答案 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;
我不知道为什么会导致相同的错误消息,但我希望这可以帮助某人。