模板专业化不起作用

时间:2014-05-13 11:44:21

标签: c++ templates c++11 variadic-templates template-specialization

请考虑以下代码:

template<typename T, size_t... i>
class Bar{};

template<typename T1, typename T2>
class Foo{};

template<typename T1, size_t... i1>
template<typename T2, size_t... i2>
struct Foo<Bar<T1,i1...>,Bar<T2,i2...>>
{
    struct Eq {};
};

如您所见,有一种可变参数类型Bar<T,size_t...>和一种类型Foo<T1,T2>。如果将两个Bar用作模板参数,则Foo具有特殊性。此专业化具有内部类型Eq

但是,以下情况不起作用:

typename Foo<Bar<int,2>,Bar<int,3>>::Eq b;

它告诉Eq中没有类型Foo<Bar<int,2>,Bar<int,3>>,即编译器不选择模板特化,而是Foo<T1,T2>的基本定义,它确实没有内部{{1}输入。

我在这里做错了什么?为什么编译器不选择专门化?

1 个答案:

答案 0 :(得分:5)

摆脱双模板参数列表:

template<typename T1, size_t... i1>
template<typename T2, size_t... i2>

更改为:

template<typename T1, size_t... i1, typename T2, size_t... i2>