尝试解析可变参数模板时“无法推断 'T' 的模板参数”
'Could not deduce template argument for 'T'' when trying to parse variadic template
我正在尝试将结构类型列表传递给另一个 class,这将采用每个自定义 class 并添加某种将结构类型放入包装器并将其插入到一个元组。一般来说,我是模板的新手,无法弄清楚为什么代码无法编译。
模板解析器包装器
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
并且不能更改它的类型 运行-time
我正在尝试将结构类型列表传递给另一个 class,这将采用每个自定义 class 并添加某种将结构类型放入包装器并将其插入到一个元组。一般来说,我是模板的新手,无法弄清楚为什么代码无法编译。
模板解析器包装器
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
并且不能更改它的类型 运行-time