Инициализация статичного вектора в потомке структуры

Рейтинг: -1Ответов: 1Опубликовано: 09.02.2023

Есть такой код, однако он не рабочий из-за того, что возникает ошибка при попытке инициализировать статичный вектор в потомке структуры:

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 = {};