考虑以下代码:

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> 的基本定义,它确实没有内部 Eq 类型。

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

最佳答案

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

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

改成:
template<typename T1, size_t... i1, typename T2, size_t... i2>

关于c++ - 模板特化不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23630347/

10-15 04:47