使用Boost序列化std :: multiplies

时间:2017-04-20 19:02:39

标签: c++ boost-serialization

我正在尝试序列化以下用户定义的对象:

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;行时,错误消失了。但我填写我需要添加该行也用于序列化。

2 个答案:

答案 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>周围的仿函数包装器。我建议您重新考虑您的设计以避免序列化,而不是通过序列化来解决错误。