首页 > 解决方案 > 类不能使用 boost::json 序列化自己

问题描述

我写了一个小类,它依赖于 boost::json 来序列化自己。它无法编译,因为编译器听起来无法找到实现 json::value<=>myClass 翻译的 tag_invoke() 函数:

/usr/include/boost/json/value_from.hpp:87:35: error: no matching function for call to ‘value_from_impl(CSpicaFTConfig&, std::remove_reference<boost::json::storage_ptr&>::type)’
 return detail::value_from_impl(
        ~~~~~~~~~~~~~~~~~~~~~~~^
     std::forward<T>(t), std::move(sp));

给出了这两个函数的实现:

CSpicaFTConfig CSpicaFTConfig::tag_invoke(value_to_tag<CSpicaFTConfig>, value const &jv);
void CSpicaFTConfig::tag_invoke(value_from_tag, value &jv, CSpicaFTConfig const &cfg);

但编译器似乎无法找到它们。

欢迎任何提示!谢谢

标签: c++boostboost-jsontag-invoke

解决方案


实际上,实现 tag_invoke() 函数的正确方法是将它们定义为自由函数,对象类的朋友(这里是 CSpicaFTConfig )进行序列化:

  // CSpicaFTConfig => boost::json::value
  friend void tag_invoke(value_from_tag, value &jv, CSpicaFTConfig const &cfg);
  // boost::json::value => CSpicaFTConfig
  friend CSpicaFTConfig tag_invoke(value_to_tag<CSpicaFTConfig>, value const &jv);

谢谢你的支持。


推荐阅读