Неработающий аргумент создание шаблонного объекта на контейнере не работает

Ниже приведен пример (не весь класс, только соответствующие части)

class Container {
private:
    size_t m_next_id;
    std::unordered_map m_objects;
public:
    template<typename Type, typename... Args> size_t create(Args... args) { return this->add(new Type (args...)); }
    size_t add(Base * obj) { m_objects.emplace(m_next_id, obj); return m_next_id++; }
}

Скажи, у меня есть следующее

class Base;
class A : Base;
class B : Base;
// etc.

Тогда следующие вызовы работают без ошибок

container.create<B, Vector2f, float>({1, 0}, 0);
container.add(new B({0, 1}, 0));
container.create<B>(Vector2f{0, 1}, 1); // EDIT no initializer list

Однако следующее производит ошибку времени компиляции

container.create<B>({1, 0}, 1);

Ошибка:

error: no matching function for call to 'Container::create(<brace-enclosed initializer list>, const int&)'
     container.create<B>({1, 0}, 1);
                                  ^
note: candidate: size_t Container::create(Args ...) [with Type = B; Args = {}; size_t = long long unsigned int]
         template<typename Type, typename... Args> size_t create(Args... args) { return this->add(new Type (args...)); }
                                                          ^~~~~~
note:   candidate expects 0 arguments, 2 provided

Я не уверен, почему шаблон не может работать с этим шаблоном, и как его исправить, чтобы он работал так, как я хочу, основываясь на примерах, которые я видел с использованием функций std emplace, это должно работать.

РЕДАКТИРОВАТЬ: Основываясь на том факте, что версия без списка инициализатора, работает нормально, я могу заключить, что проблема из-за списка инициализатора. Однако я не понимаю, почему это будет проблемой, разве это не должно быть в состоянии создать соответствующий тип на основе конструктора B, в котором вызывается B?

0 ответов

Другие вопросы по тегам