как перегрузить & lt; & lt; оператор для YAML :: Emitter для сериализации пользовательского класса, содержащего вектор другого пользовательского класса

В моем приложении у меня есть класс, содержащий вектор другого класса, и я не могу написать перегруженный YAML :: Emitter& оператор<< за это.

Чтобы проиллюстрировать это, я написал ниже файл, который воспроизводит ошибку:

Класс Department содержит вектор Employee, и мне нужно вывести Департамент со всеми сотрудниками в формате Yaml.

Я получаю следующую странную ошибку, которая не соответствует моим сигнатурам методов:

$ g ++ ta.cpp -L ~ / yaml-cpp / lib / -I ../Thanga/yaml/yaml-cpp-0.5.1/include/ -lyamlcpp 2>&1 | подробнее

ta.cpp: 37: 16: примечание: YAML :: Emitter& оператор<<(YAML :: Излучатель&, Отдел&)
ta.cpp: 37: 16: примечание: неизвестно преобразование аргумента 2 из «постоянного сотрудника» в «отдел»&»
ta.cpp: 28: 16: примечание: YAML :: Emitter& оператор<<(YAML :: Излучатель&, Работник&)
ta.cpp: 28: 16: примечание: неизвестное преобразование для аргумента 2 из «const Employee» в «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();
}

1

Решение

Перегрузки, предусмотренные для 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; }

(Как правило, вы должны сделать ваши методы получения постоянными по умолчанию, и если вам нужно изменить состояние, добавьте методы установки вместо неконстантных методов получения.)

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]