I have a class (contains a few scalar values and a vector of floats) and I want to read and write an instance as the value of another map.
// write out << YAML::Key << "my_queue" << YAML::Value << my_queue; // read (other code cut out...) for (YAML::Iterator it=doc.begin();it!=doc.end();++it) { std::string key, value; it.first() >> key; it.second() >> value; if (key.compare("my_queue") == 0) { *it >> my_queue; } }
Writing this class works perfectly, but I can't seem to read it no matter what I do. It keeps throwing an InvalidScalar.
Caught YAML::InvalidScalar yaml-cpp: error at line 20, column 13: invalid scalar
and this is that the output (written with yaml-cpp without it reporting any errors) looks like:
Other Number: 80 my_queue: size: 20 data: - 3.5 - -1 - -1.5 - 0.25 - -24.75 - -5.75 - 2.75 - -33.55 - 7.25 - -11 - 15 - 37.5 - -3.75 - -28.25 - 18.5 - 14.25 - -36.5 - 6.75 - -0.75 - 14 max_size: 20 mean: -0.0355586 stdev: 34.8981 even_more_data: 1277150400
The documentation seems to say this is supported usage, a nested map, in this case with a sequence as one of the values. It complains about it being an InvalidScalar, even though the first thing I do it tell it that this is a map:
YAML::Emitter& operator << ( YAML::Emitter& out, const MeanStd& w ) { out << YAML::BeginMap; out << YAML::Key << "size"; out << YAML::Value << w.size(); out << YAML::Key << "data"; out << YAML::Value << YAML::BeginSeq; for(Noor::Number i=0; i<w.size(); ++i) { out << w[i]; } out << YAML::EndSeq; out << YAML::Key << "max_size"; out << YAML::Value << w.get_max_size(); out << YAML::Key << "mean"; out << YAML::Value << w.mean(); out << YAML::Key << "stdev"; out << YAML::Value << w.stdev(); out << YAML::EndMap; return out; }
Does anyone see a problem with this?
When you're reading the YAML:
std::string key, value;
it.first() >> key;
it.second() >> value; // ***
if (key.compare("my_queue") == 0) {
*it >> my_queue;
}
The marked line tries to read the value of the key/value pair as a scalar (std::string
); that's why it tells you that it's an invalid scalar. Instead, you want:
std::string key, value;
it.first() >> key;
if (key.compare("my_queue") == 0) {
it.second() >> my_queue;
} else {
// ...
// for example: it.second() >> value;
}