Указатели кодирования / декодирования 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;
что в случае типа указателя означает, что он неинициализирован (для нормальных значений он инициализируется конструктором по умолчанию).