1

下面是一个例子(不是整个班级,只是相关部分)

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 的构造函数构造适当的类型吗?

4

0 回答 0