Шаблонный класс как параметр контейнера Stl - PullRequest
2 голосов
/ 08 октября 2019

Я хочу использовать любой контейнер STL, например std::vector с моим собственным типом шаблона, например OptionParams.

Если я скомпилирую свой код с пустой главной функцией - все ОК, но если яхочу напечатать любое поле моего класса шаблона в контейнере, у меня есть ошибка. Я не уверен, что это возможно использовать в классе шаблонов контейнеров Stl.

#include <vector>
#include <map>
#include <string>
#include <iostream>

template <typename T>
struct OptionParams {
    OptionParams(int level, int name, bool is_flag, T value) : level_(level), 
            name_(name), is_flag_(is_flag), value_(value) {}
    int level_;
    int name_;
    bool is_flag_;
    T value_;
};

template <typename T>
std::vector<OptionParams<T>> Options = {
    {OptionParams<int>(1, 2, 0, 3)},
    {OptionParams<std::string>(1, 2, 1, "hello")}
};

int main() {
    std::cout << Options<int>[0].level_ << std::endl;
}
map2.cpp: In instantiation of ‘std::vector<OptionParams<int>, std::allocator<OptionParams<int> > > Options<int>’:
map2.cpp:23:16:   required from here
map2.cpp:17:30: error: could not convert ‘{{OptionParams<int>(1, 2, 0, 3)}, {OptionParams<std::__cxx11::basic_string<char> >(1, 2, 1, std::__cxx11::basic_string<char>(((const char*)"hello"), std::allocator<char>()))}}’ from ‘<brace-enclosed initializer list>’ to ‘std::vector<OptionParams<int>, std::allocator<OptionParams<int> > >’
 std::vector<OptionParams<T>> Options = {
                              ^~~~~~~

1 Ответ

4 голосов
/ 08 октября 2019

Options - это шаблон переменной, который можно создать с помощью одного параметра T, чтобы получить переменную. Когда вы делаете это с Options<int> в main, вы получаете std::vector<OptionParams<int>>, который может только хранить OptionParams<int> с, но не OptionParams<std::string>. Поскольку нет возможности преобразования между различными OptionParam<T> с, вы получите ошибку.

Если вы хотите хранить гетерогенные объекты внутри std::vector, вам нужно какое-то стирание типа. Например, все специализации OptionParams<T> наследуются от общего базового класса и сохраняют std::unique_ptr s для этого базового класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...