2
// p1: some value
// nt: native type
template<int p1, typename nt>
struct A {};

// pt: pointer to type i.e. int*
// tA: a specialization of A
template<typename pt, typename tA>
struct B1 {};

// pt: pointer to type i.e. int*
// tA: a specialization of A
template<typename pt, typename tA>
struct B2 {};

// tB: specialization of B?
// tA: specialization of A
template<typename tB, typename tA>
struct C {};

// now i want to create a C partial specialization where:
//  A<some_value, native_type>
//  B?<char*, A<some_value, native_type> >

template< template<typename, typename> class B, int p1, typename nt >
struct C< B<char*, A<p1, nt> >, A<p1, nt> > {};

int main()
{
    C< B1, A<10, int> > c;
}

使用 clang 编译上述代码时,会出现以下错误:

error: use of class template B1 requires template arguments
   C< B1, A<10, int> > c;
      ^~

我理解错误并修复它B1应该是B1<char*, A<10, int> >。编译器是否应该从最匹配的特化中扣除这些参数的值?

4

1 回答 1

4

编译器是否应该从最匹配的特化中扣除这些参数的值?

我不确定我是否理解你的问题,但如果我理解了,那么答案是“不”。编译器不知道如何B1从类模板的裸名(B1在这种情况下)推断出完全实例化的类型(在这种情况下是 的特化)。您必须为B1.

请记住,在您为主模板提供了必要的参数之后,会选择主模板的特化。在这种情况下,您的主模板接受两个类型参数,并且您必须提供两个类型参数。

您在模板专业化中使用模板模板参数B以匹配作为实例的类型参数这一B事实不会改变您的主模板的参数是两个(完全实例化)类型的事实。

于 2013-05-20T13:57:11.190 回答