我正在尝试序列化以下用户定义的对象:
ConcatConstMapping<std::multiplies<double> >* obj;
Boost向我显示以下错误:
> /usr/include/boost/serialization/access.hpp:118:9: error: ‘struct
> std::multiplies<double>’ has no member named ‘serialize’
这就是类ConcatConstMapping
的样子:
template<class Operator>
class ConcatConstMapping: public ConstMapping
{
protected:
typedef std::pair<Dimension, Argument::const_iterator> DimIteratorPair;
typedef std::list<ConstMapping*> MappingSet;
MappingSet mappings;
ConstMapping* refMapping;
bool continueOutOfRange;
Argument::mapped_type oorValue;
Operator op;
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & archive, const unsigned int version)
{
archive & mappings;
archive & refMapping;
archive & continueOutOfRange;
archive & oorValue;
archive & op;
}
};
编辑:当我评论第archive & op;
行时,错误消失了。但我填写我需要添加该行也用于序列化。
答案 0 :(得分:0)
对于自定义类,您需要自己声明serialize
函数,作为类的一部分或作为自由函数,如documentation中所述。
template<class Archive>
inline void serialize(
Archive & ar,
my_class & t,
const unsigned int file_version
) {
// For example:
ar & t.member_one;
ar & t.member_two;
....
}
答案 1 :(得分:0)
我不确定你为什么要序列化separate_
,因为它没有存储任何数据......所以没有什么可序列化的。为了满足编译器,应该这样做:
lapply(Data, function(i){
separate_(i, col = colnames(i)[1],
into = c("col_name_1NEW", "col_name_2NEW"),
sep = " ")
})
如果你提供这个,编译器将选择一个匹配的函数......它什么都不做。
我想你可以为multiplies
进一步模板化。
template<class Archive>
inline void serialize(
Archive & ar,
std::multiplies<double> & t,
const unsigned int file_version
) { }
没有状态,它只是multiplies<T>
周围的仿函数包装器。我建议您重新考虑您的设计以避免序列化,而不是通过序列化来解决错误。