提升序列化仅适用于主要?当我在其他对象中使用时,继续说"has no member named ‘serialize’"
Boost serialization only works in main? Keep saying "has no member named ‘serialize’" when I use in other objects
我目前正在使用c ++ boost库来保存来自实时控制系统(操作系统:Linux(的一些数据。我想要保存的数据是按以下方式定义的对象:
#ifndef RECDATA_HPP
#define RECDATA_HPP
#include <vector>
template<class T>
class RecData
{
private:
std::vector<std::vector<T>> data;
std::vector<unsigned long> time;
// Allow serialization to access non-public data members.
friend class boost::serialization::access;
// Implement serialize method
template <class Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar & data;
ar & time;
}
public:
std::vector<std::vector<T>> getData(){
return this->data;
}
std::vector<unsigned long> getTime(){
return this->time;
}
void PushData(std::vector<T> inData);
void PushTime(unsigned long curTime);
};
template<class T>
void RecData<T>::PushData(std::vector<T> inData){
this->data.push_back(inData);
}
template<class T>
void RecData<T>::PushTime(unsigned long curTime){
this->time.push_back(curTime);
}
#endif //RECDATA_HPP
当我直接将其保存在main中时,这工作正常,例如:
#include <fstream>
#include <iostream>
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include "vect_container.hpp"
#include "Recorder.hpp"
#include "RecData.hpp"
int main()
{
RecData<int> *recData1 = new RecData<int>();
for(int i=0;i<5;i++){
std::vector<int> temp;
for(int k=0;k<10;k++){
temp.push_back(i+k);
}
recData1->PushData(temp);
recData1->PushTime((unsigned long)i);
}
{
std::ofstream ofs("temp.dat");
boost::archive::text_oarchive ar(ofs);
ar & *recData1;
delete recData1;
}
RecData<int> restore = RecData<int>();
{
std::ifstream ifs("temp.dat");
boost::archive::text_iarchive ar(ifs);
ar &restore;
}
std::vector<unsigned long> timeGet = restore.getTime();
std::vector<std::vector<int>> dataGet = restore.getData();
for(int i=0;i<5;i++){
std::cout<<timeGet[i]<<std::endl;
for(int k=0;k<10;k++){
std::cout<<dataGet[i][k];
}
std::cout<<std::endl;
}
}
但是,如果现在我在对象中调用此方法,则它无法编译。
template<class T>
void Recorder::writeTemp(RecData<T> *tempData, int recType)
{
{
std::ofstream ofs(this->fileName);
boost::archive::text_oarchive ar(ofs);
ar & *tempData;
delete tempData;
}
}
编译器一直告诉我:
error: ‘class std::vector<std::vector<int>, std::allocator<std::vector<int> > >’ has no member named ‘serialize’
或
error: ‘class std::vector<std::vector<int>, std::allocator<std::vector<int> > >’ has no member named ‘serialize’
然而,我相信我已经在类 RecData 中明确定义了序列化,当我在 main 中序列化此类对象时它起作用。我想知道这个问题的原因是什么。
我编辑了您的截图,以产生以下最小可重现的示例:
#include <vector>
#include <fstream>
#include <iostream>
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
//Comment below line, get same error
#include <boost/serialization/vector.hpp>
template<class T>
class RecData
{
private:
std::vector<std::vector<T>> data;
std::vector<unsigned long> time;
// Allow serialization to access non-public data members.
friend class boost::serialization::access;
// Implement serialize method
template <class Archive>
void serialize(Archive& ar, const unsigned int version)
{
ar& data;
ar& time;
}
public:
std::vector<std::vector<T>> getData() {
return this->data;
}
std::vector<unsigned long> getTime() {
return this->time;
}
void PushData(std::vector<T> inData);
void PushTime(unsigned long curTime);
};
template<class T>
void RecData<T>::PushData(std::vector<T> inData) {
this->data.push_back(inData);
}
template<class T>
void RecData<T>::PushTime(unsigned long curTime) {
this->time.push_back(curTime);
}
int main()
{
RecData<int>* recData1 = new RecData<int>();
for (int i = 0; i < 5; i++) {
std::vector<int> temp;
for (int k = 0; k < 10; k++) {
temp.push_back(i + k);
}
recData1->PushData(temp);
recData1->PushTime((unsigned long)i);
}
{
std::ofstream ofs("temp.dat");
boost::archive::text_oarchive ar(ofs);
ar&* recData1;
delete recData1;
}
}
如果我注释掉
#include <boost/serialization/vector.hpp>
我得到和你一样的错误,
Error C2039 'serialize': is not a member of 'std::vector<std::vector<T,std::allocator<_Ty>>,std::allocator<std::vector<_Ty,std::allo>cator<_Ty>>>>'
Error C2039 'serialize': is not a member of 'std::vector<unsigned long,std::allocator<_Ty>>'
如果我保留该行,它会编译。因此,我相信在某种程度上,您的主要内容是间接包含上述标头,而您定义函数的文件则不是。尝试将标头也包含在定义函数的文件中,在定义 RecData
的标头中。我认为它应该放在RecData
的标题中,因为需要该文件才能成功使用该类,但选择取决于您。
在Microsoft Visual Studio 2019中测试,Boost 1.70.0
相关文章:
- 循环后如何继续阅读
- 我正在尝试使用 c++ 创建一个货币转换程序,我不知道如何继续
- C++:继续创建新的变量可以吗
- std::unordered_map 类型对象声明期间出现"field has incomplete type"错误
- 如何继续读取不同功能中的文件,而不是从头开始再次读取文件?
- 使用"std::enable_if_t" "function template has already been defined"
- 在 c++ 中三元运算符中不允许继续(关键字)吗?
- C++ 如何暂停控制台输出,以便用户可以在继续之前阅读信息
- 循环不继续无法弄清楚为什么
- 附加到 gdb 会中断并且不会继续该过程
- C++ 在信号处理程序后继续执行
- 为什么我的Qt程序在断言失败后继续运行?
- 如何打印下一个字母直到 Z 并继续到 A?
- 超时后,线程睡眠不会继续执行
- 使用 ssh 重新连接到远程 Ubuntu 机器后,如何继续使用 gdb 调试 c++ 代码?
- 如何创建一个 while 循环,继续循环,直到在C++中输入'using streams'键?
- 使用 GraphicsPath::AddString() 抱怨"class 'GraphicsPath' has no member 'AddString'"
- 失败后可以继续从流读取吗?
- 在构造函数中删除后继续执行
- 提升序列化仅适用于主要?当我在其他对象中使用时,继续说"has no member named ‘serialize’"