Не могу прочитать вложенные карты (поднимает YAML :: InvalidScalar) - PullRequest
1 голос
/ 28 июня 2010

У меня есть класс (содержит несколько скалярных значений и вектор с плавающей точкой), и я хочу прочитать и записать экземпляр как значение другой карты.

// 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;
    }
 }

Написание этого класса работает отлично,но я не могу читать это независимо от того, что я делаю.Он продолжает выдавать InvalidScalar.

Caught YAML::InvalidScalar  yaml-cpp: error at line 20, column 13: invalid scalar

, и это означает, что вывод (записанный с помощью yaml-cpp без сообщения об ошибках) выглядит так:

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

Документация, кажется, говоритэто поддерживаемое использование, вложенная карта, в данном случае с последовательностью в качестве одного из значений.Он жалуется на то, что это InvalidScalar, хотя я первым делом говорю, что это карта:

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;
}

Кто-нибудь видит проблему с этим?

1 Ответ

1 голос
/ 29 июня 2010

Когда вы читаете YAML:

std::string key, value;
it.first() >> key;
it.second() >> value; // ***
if (key.compare("my_queue") == 0) {
  *it >> my_queue;
}

Отмеченная строка пытается прочитать значение пары ключ / значение в виде скаляра (std::string); вот почему он говорит вам, что это неправильный скаляр. Вместо этого вы хотите:

std::string key, value;
it.first() >> key;
if (key.compare("my_queue") == 0) {
  it.second() >> my_queue;
} else {
  // ...
  // for example: it.second() >> value;
}
...