使用 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_); */
}