【发布时间】:2016-05-01 21:17:01
【问题描述】:
我收到“模板参数数量错误(2,应该是 1)”的错误,我无法真正理解。
我有一个类,它为想要与之交互的其他类型提供一些帮助函数,设置第一个模板参数,它们必须在创建时自动同意相互兼容。为了以一种方便、通用的方式执行此操作,我决定使用可变参数模板,该模板旨在传递构造函数参数和要创建的对象类型采用的其他模板参数:
template<typename INTERNAL_TYPE>
class Linker
{
template< template<typename, typename ...> class INPUT_OBJ_TYPE, class ... TEMPLATE_ARGS, class ... CONSTRUCTOR_ARGS >
std::shared_ptr< INPUT_OBJ_TYPE<INTERNAL_TYPE,TEMPLATE_ARGS ...> > getLinked( CONSTRUCTOR_ARGS ... args )
{
std::shared_ptr< INPUT_OBJ_TYPE<INTERNAL_TYPE,TEMPLATE_ARGS ...> > ptr = std::make_shared< INPUT_OBJ_TYPE<INTERNAL_TYPE,TEMPLATE_ARGS ...> >( args... );
return ptr;
}
};
这适用于以下课程:
template<typename INTERNAL_TYPE, typename SECOND_TYPE>
class TEST_CLASS_1
{};
也就是说,我可以做到以下几点:
Linker<int> container;
auto test_1 = container.getLinked<TEST_CLASS_1,double>();
然后我尝试对另一个仅在一个参数上模板化的类做同样的事情:
template<typename INTERNAL_TYPE>
class TEST_CLASS_2
{};
auto test_2 = container.getLinked<TEST_CLASS_2>();
但是得到上面提到的错误..为什么?如果我从函数声明/定义中删除 TEMPLATE_ARGS ,我想尽可能多地为第二个测试编译代码(虽然第一个测试不再)。所以我认为当时的编译器还没有意识到 TEMPLATE_ARGS 对于第二个测试是空的,并且由于模板参数太多而引发错误。所以我想我可能需要使用尾随返回类型,例如
template< template<typename, typename ...> class INPUT_OBJ_TYPE,
class ... TEMPLATE_ARGS, class ... CONSTRUCTOR_ARGS >
auto getLinked( CONSTRUCTOR_ARGS ... args )
-> std::shared_ptr< INPUT_OBJ_TYPE<TREE_TYPE,TEMPLATE_ARGS ...> >
或使用decltype,但这也不起作用:
template< template<typename, typename ...> class INPUT_OBJ_TYPE,
class ... TEMPLATE_ARGS, class ... CONSTRUCTOR_ARGS >
auto getLinked( CONSTRUCTOR_ARGS ... args )
->decltype(std::shared_ptr< INPUT_OBJ_TYPE<TREE_TYPE,TEMPLATE_ARGS ...> >())
我对这个问题是否正确?我该如何解决?
非常感谢!
【问题讨论】:
标签: c++ templates variadic-templates variadic