'尝试解析可变参数模板时无法推断出'T的模板参数

'Could not deduce template argument for 'T'' when trying to parse variadic template

本文关键字:参数 推断出 变参      更新时间:2023-10-16

我正试图将一个结构类型列表传递到另一个类中,该类将接受每个自定义类并添加某种类型。将结构类型放入包装器并将其插入元组中。一般来说,我是模板的新手,不知道为什么代码不能编译。

模板解析器包装器的东西

namespace engine
{
template<class T>
struct component_manager
{
int component_id;
std::vector<T> components;
component_manager() : component_id(id_counter) { id_counter++; }
};
template<class... Ts>
class ecs_manager
{
public:
std::tuple<> components;

template<class... Ts>
ecs_manager()
{
constructor_helper<Ts...>();
}
template<class T, class... Ts>
void constructor_helper()
{
components = std::tuple_cat(components, component_manager<T>());
constructor_helper<Ts...>();
}
template<class T>
void constructor_helper() {}
};
}

结构

struct transform
{
engine::vector3 position;
engine::vector3 rotation;
engine::vector3 scale;
};
struct motion
{
engine::vector3 velocity;
};
struct mesh
{
int id;
};

创建模板解析器包装器engine::ecs_manager<transform, motion, mesh> ecs;

编译时,我会得到以下信息:无法推导"T"的模板参数未找到匹配的重载函数

不确定。。。但我想你在找

template <typename ... Ts>
class ecs_manager
{
public:
std::tuple<component_manager<Ts>...> components;

ecs_manager () 
: components{ component_manager<Ts>{} ... }
{ }
};

不管怎样。。。C++是一种强类型语言。

所以你不能定义一个空元组

std::tuple<> components;

并递归递增

components = std::tuple_cat(components, component_manager<T>());

您必须根据需要定义components,并且不能更改其类型运行时