Указатели кодирования / декодирования yaml-cpp?

Поэтому я пытаюсь использовать yaml-cpp с данными, содержащими указатели, вот мой код:

struct InventoryItem {
  std::string name;
  int baseValue;
  float weight;
};

struct Inventory {
  float maximumWeight;
  std::vector<InventoryItem*> items;
};

namespace YAML {
template <>
struct convert<InventoryItem*> {
  static Node encode(const InventoryItem* inventoryItem) {
    Node node;

    node["name"] = inventoryItem->name;
    node["baseValue"] = inventoryItem->baseValue;
    node["weight"] = inventoryItem->weight;

    return node;
  }

  static bool decode(const Node& node, InventoryItem* inventoryItem) {
    // @todo validation
    inventoryItem->name = node["name"].as<std::string>();
    inventoryItem->baseValue = node["baseValue"].as<int>();
    inventoryItem->weight = node["weight"].as<float>();

    return true;
  }
};

template <>
struct convert<Inventory> {
  static Node encode(const Inventory& inventory) {
    Node node;

    node["maximumWeight"] = inventory.maximumWeight;
    node["items"] = inventory.items;

    return node;
  }

  static bool decode(const Node& node, Inventory& inventory) {
    // @todo validation
    inventory.maximumWeight = node["maximumWeight"].as<float>();
    inventory.items = node["items"].as<std::vector<InventoryItem*>>();

    return true;
  }
};
}

Но я получаю следующую ошибку:

impl.h(123): error C4700: uninitialized local variable 't' used

Который ссылается на последний оператор if в этом блоке кода (этот код находится в библиотеке yaml-cpp:

template <typename T>
struct as_if<T, void> {
  explicit as_if(const Node& node_) : node(node_) {}
  const Node& node;

  T operator()() const {
    if (!node.m_pNode)
      throw TypedBadConversion<T>(node.Mark());

    T t;
    if (convert<T>::decode(node, t)) // NOTE: THIS IS THE LINE THE COMPILER ERROR IS REFERENCING
      return t;
    throw TypedBadConversion<T>(node.Mark());
  }
};

Кто-нибудь знает, почему я могу получить эту ошибку?

1 ответ

Исходя из ответа от gamedev.net, проблема в том, что мой декодер должен выглядеть так:

static bool decode(const Node& node, InventoryItem* inventoryItem) {
  // @todo validation
  inventoryItem = new InventoryItem(); // NOTE: FIXES COMPILER ERROR
  inventoryItem->name = node["name"].as<std::string>();
  inventoryItem->baseValue = node["baseValue"].as<int>();
  inventoryItem->weight = node["weight"].as<float>();

  return true;
}

Это потому, что код библиотеки yaml-cpp просто объявляет переменную с T t; что в случае типа указателя означает, что он неинициализирован (для нормальных значений он инициализируется конструктором по умолчанию).

Другие вопросы по тегам