У меня есть система ресурсов с базовым классом ресурсов, используя CRTP для управления статическим объектом ресурса по умолчанию для каждого типа ресурса, который решает наследовать Из этого (как можно увидеть в следующем примере). < /p>
Минимальный пример: < /p>
Код: Выделить всё
template
class Resource {
private:
static inline ResourceT defaultResource;
public:
Resource() {}
static ResourceT* getDefaultResourceRef() {
return &defaultResource;
}
static void setDefaultResource(ResourceT pDefaultResource) {
defaultResource = pDefaultResource;
}
};
class Texture : public Resource {
private:
// Any implementation
public:
Texture() : Resource() {}
};
int main() {
Texture tex;
return 0;
}
Я использовал Clang ++ для этих тестов, но когда я пытаюсь скомпилировать его с MSVC, он приводит к ошибкам, потому что ничего о DefaulTresource ( /
Код: Выделить всё
ResourceTи. Заказ инициализации «Фиаско»/Задача, CRTPS с компиляцией, полученное типом, неполнота и то, как C ++ обрабатывает различные виды статических переменных в целом, но все еще не может указать на точную причину этого в моем случае. Я не как -то не так, не так ли? быть доступным, верно? Почему это не известно? И почему, черт возьми, разные компиляторы, по -видимому, делают все, что они хотят? Я думаю, что это из -за неопределенного поведения, которое происходит здесь, но, пожалуйста, объясните. Предлагается в статье FAQ, связанной выше, но я хотел бы сохранить статический элемент как обычную переменную члена и в идеале не пройти через какой -то другой механизм перенаправления, если это возможно. Так что мне здесь не хватает, то, что я перечислил, уже причина, и есть ли лучшее решение для этого?
Спасибо
Подробнее здесь: https://stackoverflow.com/questions/794 ... on-crashes
Мобильная версия