功能模板中的模板模板参数出现问题

时间:2020-11-08 12:20:14

标签: c++ templates

我正在尝试使用模板template参数,但是我的代码无法编译。

template<class DataType, template<class T> class Container>
void foo(Container<DataType> test)
{
    
}

int main()
{
    std::vector<int> testVec{1,2,3,4};
    
    foo<int, std::vector>(testVec);
}

错误消息是 “没有匹配功能可调用'foo'。

  1. 候选模板被忽略:模板参数'Container'的显式指定参数无效

有人可以帮我吗?

1 个答案:

答案 0 :(得分:2)

建议:尝试

// ...............................VVVVVVVVV
template<class DataType, template<class ...> class Container>
void foo(Container<DataType> test)
{
    
}

问题在于std::vector接受两个类型的模板参数;第二个具有默认值。

如果你写

// ...............................VVVVVVV
template<class DataType, template<class T> class Container>

您要求一个接受单个类型模板参数的模板模板参数。

因此您可以解决询问两个类型模板参数

// ...............................VVVVVVVVVVVV
template<class DataType, template<class, class> class Container>

或更灵活地说,是类型模板参数的可变列表

// ...............................VVVVVVVVV
template<class DataType, template<class ...> class Container>

正如HolyBlackCat指出的(感谢),您的代码(因此,要求单个类型模板参数的模板模板参数)应在C ++ 17之前失败,但应从C ++ 17开始接受(更改匹配规则) )。

不幸的是,这适用于g ++,但不适用于clang ++:默认情况下,clang ++开发人员不会实现此新的C ++ 17匹配规则。

但是HolylangCat报告也使用clang ++接受您的代码,并添加了一个特殊参数:-frelaxed-template-template-args