模板专业化不起作用

gex*_*ide 4 c++ templates template-specialization variadic-templates c++11

请考虑以下代码:

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 {};
};
Run Code Online (Sandbox Code Playgroud)

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

但是,以下不起作用:

typename Foo<Bar<int,2>,Bar<int,3>>::Eq b;
Run Code Online (Sandbox Code Playgroud)

它讲述的是没有类型EqFoo<Bar<int,2>,Bar<int,3>>,即,编译器不挑模板专业化,但基本定义的Foo<T1,T2>这的确没有内在的Eq类型.

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

zch*_*zch 5

只需摆脱双模板参数列表:

template<typename T1, size_t... i1>
template<typename T2, size_t... i2>
Run Code Online (Sandbox Code Playgroud)

改成:

template<typename T1, size_t... i1, typename T2, size_t... i2>
Run Code Online (Sandbox Code Playgroud)