gpt4 book ai didi

c++ - 如何为 YAML::Emitter 重载 << 运算符以序列化包含另一个自定义类的 vector 的自定义类

转载 作者:太空宇宙 更新时间:2023-11-04 13:58:46 26 4
gpt4 key购买 nike

在我的应用程序中,我有一个类包含另一个类的 vector ,我无法为此编写重载的 YAML::Emitter& operator<<。

为了说明,我编写了重现错误的波纹管文件:

Department 类包含一个 Employee vector ,我需要以 Yaml 格式输出包含所有员工的 Department。

我收到以下似乎与我的方法签名不匹配的奇怪错误:

$ g++ ta.cpp -L ~/yaml-cpp/lib/ -I ../Thanga/yaml/yaml-cpp-0.5.1/include/ -lyamlcpp 2>&1|more ... ta.cpp:37:16: note: YAML::Emitter& operator<<(YAML::Emitter&, Department&) ta.cpp:37:16: note: no known conversion for argument 2 from ‘const Employee’ to ‘Department&’ ta.cpp:28:16: note: YAML::Emitter& operator<<(YAML::Emitter&, Employee&) ta.cpp:28:16: note: no known conversion for argument 2 from ‘const Employee’ to ‘Employee&’

完整的源文件如下:

#include <iostream>
#include <fstream>
#include "yaml-cpp/yaml.h"
#include <cassert>
#include <vector>
#include <string>

struct Employee
{
std::string name;
std::string surname;
int age;
std::string getName(){return name;}
std::string getSurname(){return surname;}
int getAge(){return age;}
};

struct Department
{
std::string name;
int headCount;
std::vector<Employee> staff;
std::string getName(){return name;}
int getHeadCount(){return headCount;}
std::vector<Employee> & getStaff(){return staff;}
};

YAML::Emitter& operator << (YAML::Emitter& out, Employee& e) {
out << YAML::BeginMap;
out << YAML::Key <<"name"<<YAML::Value <<e.getName();
out << YAML::Key <<"surname"<<YAML::Value <<e.getSurname();
out << YAML::Key <<"age"<<YAML::Value <<e.getAge();
out << YAML::EndMap;
return out;
}

YAML::Emitter& operator << (YAML::Emitter& out, Department& d) {
out << YAML::BeginMap;
out << YAML::Key <<"name"<<YAML::Value <<d.getName();
out << YAML::Key <<"headCount"<<YAML::Value <<d.getHeadCount();
out << YAML::Key <<"Employees"<<YAML::Value <<d.getStaff();
out << YAML::EndMap;
return out;
}


int main()
{
Employee k;
Department d;

d.name="Twidlers";
d.headCount=5;

k.name="harry";
k.surname="person";
k.age=70;
d.staff.push_back(k);

k.name="joe";
k.surname="person";
k.age=30;
d.staff.push_back(k);

k.name="john";
k.surname="doe";
k.age=50;
d.staff.push_back(k);

std::ofstream ofstr("output.yaml");
YAML::Emitter out;
out<<d;
ofstr<<out.c_str();
}

最佳答案

vector 提供的重载拿个const std::vector<T>& , 所以你必须撒一些额外的 const贯穿始终:

YAML::Emitter& operator << (YAML::Emitter& out, const Employee& e)
...
YAML::Emitter& operator << (YAML::Emitter& out, const Department& d)

然后将它们放在您的成员函数中,例如:

const std::vector<Employee>& getStaff() const { return staff; }

(一般来说,你应该让你的 getter 默认为常量,如果你需要改变状态,添加 setter 而不是非常量的 getter。)

关于c++ - 如何为 YAML::Emitter 重载 << 运算符以序列化包含另一个自定义类的 vector 的自定义类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20193890/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com