使用 boost::serialization 代码将 *this 传递给模板函数会出错
passing *this to template function with boost::serialization code makes error
我有一个从文本文件加载的免费模板函数:
// free template function
template<class U>
bool Main_Load(U& dataset, const std::string path) {
// Create an input archive
std::ifstream ifs(path);
boost::archive::text_iarchive archive_text(ifs);
// Load data
archive_text & dataset;
}
...
// in main()
Dataset1 dataset_restored;
Main_Load(dataset_restored, filename); // <--- OK
但是当我从一个成员函数调用这个模板函数时我得到了一个错误"what(): input stream error":
class Dataset1 {
...
virtual auto LoadDataset(AUX::DATA::SerializationType serialisation_type=AUX::DATA::SerializationType::Xml) -> bool {
Main_Load(*this, GetPath()); // <--- ERROR
};
};
...
// in main()
Dataset1 dataset_restored;
dataset_restored.LoadDataset(AUX::DATA::SerializationType::Text);
为什么我可以传递 dataset_restored 但不能传递同一个对象的 *this?我想 *this 和以下内容有问题:
archive_text & dataset;
编辑
我已经回答了我自己的问题。见下文。
我在我的代码中发现了错误。
错误出现在我的代码的第 488 行(请参阅下面的 link):
// Load/Save
virtual auto LoadDataset(AUX::DATA::SerializationType serialisation_type=AUX::DATA::SerializationType::Xml) -> bool {
return AUX::DATA::Load(*this, GetPath(), serialisation_type);
//return Main_Load(*this, GetPath());
};
virtual auto SaveDataset(AUX::DATA::SerializationType serialisation_type=AUX::DATA::SerializationType::Xml) const -> bool {
return AUX::DATA::Save(*this, GetPath(), serialisation_type); // the ERROR was here mit 'this' passed and not '*this' so it saved but the load method (four lines up) did not work in conjunction with boost::serialization
//return Main_Save(*this, GetPath());
};
我花了三天的汗水和三天的哭泣才在boost::serialization中制作了一个示例代码,以供我以后的工作使用。文档很糟糕,所以我想与 public.
分享代码
这里是 boost::serialiazation 的完整示例,其中包含继承,所有数据中的 == 类 用于测试相等性以及 main() 中的两个测试用例:
http://coliru.stacked-crooked.com/a/e241bda2210e3d02
它可以保存和加载二进制、文本和 xml(更改 main() 中的第一行)。
此外,它还有一个可选的管理器,可以在地图中存储多个数据集,并且 stores/loads 它们 into/from 一次将所有文件分开(参见 main() 中的第二个用例)。
在某些成员中,您可以看到应该也适用于文本和二进制格式的替代代码:
template <class T>
void Dataset1::save_impl_text_binary(T& archive, const unsigned int version) const {
archive & boost::serialization::base_object<Dataset0>(*this);
archive & m_a1_;
archive & m_b1_;
/* archive & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Dataset0);
archive & BOOST_SERIALIZATION_NVP(m_a1_);
archive & BOOST_SERIALIZATION_NVP(m_b1_); */
}
我有一个从文本文件加载的免费模板函数:
// free template function
template<class U>
bool Main_Load(U& dataset, const std::string path) {
// Create an input archive
std::ifstream ifs(path);
boost::archive::text_iarchive archive_text(ifs);
// Load data
archive_text & dataset;
}
...
// in main()
Dataset1 dataset_restored;
Main_Load(dataset_restored, filename); // <--- OK
但是当我从一个成员函数调用这个模板函数时我得到了一个错误"what(): input stream error":
class Dataset1 {
...
virtual auto LoadDataset(AUX::DATA::SerializationType serialisation_type=AUX::DATA::SerializationType::Xml) -> bool {
Main_Load(*this, GetPath()); // <--- ERROR
};
};
...
// in main()
Dataset1 dataset_restored;
dataset_restored.LoadDataset(AUX::DATA::SerializationType::Text);
为什么我可以传递 dataset_restored 但不能传递同一个对象的 *this?我想 *this 和以下内容有问题:
archive_text & dataset;
编辑 我已经回答了我自己的问题。见下文。
我在我的代码中发现了错误。
错误出现在我的代码的第 488 行(请参阅下面的 link):
// Load/Save
virtual auto LoadDataset(AUX::DATA::SerializationType serialisation_type=AUX::DATA::SerializationType::Xml) -> bool {
return AUX::DATA::Load(*this, GetPath(), serialisation_type);
//return Main_Load(*this, GetPath());
};
virtual auto SaveDataset(AUX::DATA::SerializationType serialisation_type=AUX::DATA::SerializationType::Xml) const -> bool {
return AUX::DATA::Save(*this, GetPath(), serialisation_type); // the ERROR was here mit 'this' passed and not '*this' so it saved but the load method (four lines up) did not work in conjunction with boost::serialization
//return Main_Save(*this, GetPath());
};
我花了三天的汗水和三天的哭泣才在boost::serialization中制作了一个示例代码,以供我以后的工作使用。文档很糟糕,所以我想与 public.
分享代码这里是 boost::serialiazation 的完整示例,其中包含继承,所有数据中的 == 类 用于测试相等性以及 main() 中的两个测试用例:
http://coliru.stacked-crooked.com/a/e241bda2210e3d02
它可以保存和加载二进制、文本和 xml(更改 main() 中的第一行)。
此外,它还有一个可选的管理器,可以在地图中存储多个数据集,并且 stores/loads 它们 into/from 一次将所有文件分开(参见 main() 中的第二个用例)。
在某些成员中,您可以看到应该也适用于文本和二进制格式的替代代码:
template <class T>
void Dataset1::save_impl_text_binary(T& archive, const unsigned int version) const {
archive & boost::serialization::base_object<Dataset0>(*this);
archive & m_a1_;
archive & m_b1_;
/* archive & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Dataset0);
archive & BOOST_SERIALIZATION_NVP(m_a1_);
archive & BOOST_SERIALIZATION_NVP(m_b1_); */
}