Я столкнулся с действительно странной ошибкой в моем приложении. Это видео игра, которая использует Пуля Физика среди других библиотек.
После реализации интерфейса SQLite обнаружение столкновений было перепутано. Игроки проваливаются по местности или сталкиваются с невидимыми объектами. Для меня это выглядит как неправильный доступ к памяти. Функциональность базы данных работает нормально, хотя.
Я мог бы уже сузить вопрос. Интерфейс SQLite использует черты типов, которые предоставляются различными хранимыми типами. При комментировании всех специализаций черт столкновения работают нормально.
Как я могу найти причину этой ошибки? Пожалуйста, дайте мне знать, может ли какая-либо другая информация быть полезной для решения проблемы, чтобы я мог включить ее в вопрос.
Обновление: это код, который мне нужно комментировать для правильных коллизий. Тип хранения Person
,
Тип / человек / type.h
#pragma once
struct Person
{
float Height, Mass;
// ...
};
Тип / человек / trait.h
#pragma once
#include "type.h"#include "manager/data/manager.h"using namespace std;
template <>
struct ManagerDataTrait<Person>
{
static const unordered_map<string, string> Fields;
static void Serialize(Person *Instance, ManagerData::Serialization *Data)
{
Data->FLOAT("height", Instance->Height);
Data->FLOAT("mass", Instance->Mass);
}
static void Deserialize(Person *Instance, ManagerData::Deserialization *Data)
{
Instance->Height = Data->FLOAT("height");
Instance->Mass = Data->FLOAT("mass");
}
};
Тип / человек / general.cpp
#include "type.h"#include "trait.h"using namespace std;
const unordered_map<string, string> ManagerDataTrait<Person>::Fields = []{
unordered_map<string, string> fields;
fields.insert(std::make_pair("height", "FLOAT"));
fields.insert(std::make_pair("mass", "FLOAT"));
return fields;
}();
Пользователь Yakk ответил на мой вопрос в комментариях.
Специализация должна быть видна рядом с типом. Происходит неопределенное поведение
если одна единица видит это, а другая нет.
Других решений пока нет …