Инициализация статичного вектора в потомке структуры
Есть такой код, однако он не рабочий из-за того, что возникает ошибка при попытке инициализировать статичный вектор в потомке структуры:
template<typename T>
struct Component {
uint32_t id;
static std::vector<T> components;
static T* GetComponent(uint32_t find) {
for (int i = 0; i < components.size(); ++i) {
if (components[i].id == find) {
return components[i];
}
}
return nullptr;
}
};
struct Transform : public Component<Transform> {
double x, y, rot;
};
Transform::components = 0; //Ошибка здесь
int main() {
Transform tr;
Transform::components.push_back(tr);
}
Каким образом можно реализовать хранилище всех компонентов(возможно, с помощью шаблонов) без реализации отдельного под это класс и лишнего кода?
Ответы (1 шт):
- Вы пытаетесь наследовать так:
Аявляется наследникомВ, который является специализацией шаблона по типуА. Тип B не может существовать пока нет типаА, поэтому не существует его статический член(раз и его нет). - при объявлении Transform::components, нужно указать его тип, и если это вектор, то не возможно инициализировать его нулем(вектор не число), а возможно инициализировать как пустой вектор.
Не очень понятно, что вы хотите наследовать, но если вам нужен рабочий пример, то с учетом вышеуказанного, можете написать, например такую структуру:
struct Transform : public Component< double>{
double x, y, rot;
};
Теперь Transform наследник Component< double>, который имеет статический член components типа std::vector<double>. Компилятор будет искать его объявление, а любое объявление возможно только с указанием типа. Нужно его определить как пустой вектор? Можете инициализировать универсальным инициализатором(конечно указав тип, как и при любом объявлении):
std::vector<double> Transform::components = {};