В моем приложении у меня есть класс, содержащий вектор другого класса, и я не могу написать перегруженный 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();
}
Перегрузки, предусмотренные для 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; }
(Как правило, вы должны сделать ваши методы получения постоянными по умолчанию, и если вам нужно изменить состояние, добавьте методы установки вместо неконстантных методов получения.)
Других решений пока нет …