我正在尝试使用模板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'。
有人可以帮我吗?
答案 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
。