会员类型模板专业化

时间:2015-03-29 20:34:46

标签: c++ templates using

我有一个带有两个整数参数的类模板S1

template <int A, int B> struct S1 { };

我有另一个带有一个整数参数的类模板S2。在S2中,有一个专门用于My_S1的类型模板S1。通过S1S2的专业化实例化main时,它可以正常工作:

template<int A> struct S2 {
  template<int B>
  using My_S1 = S1<A, B>;
};

int main(int argc, char *argv[]) {
  using S1_a = S2<0>::My_S1<0>;
}

但是如果我尝试在下面的第三个类模板中执行此操作,则在编译时会出错。完整代码:

template<int A, int B>
struct S1 { } ;

template<int A>
struct S2 {
  template<int B>
  using My_S1 = S1<A, B>;
};

template<int A, int B>
struct S3 {
  using My_S1 = typename S2<A>::My_S1<B>; // I get an error on this line
};

int main(int argc, char * argv[]) {
  using S1_a = S1<0, 0>;         // works fine, of course
  using S1_b = S2<0>::My_S1<0>;  // works fine
  using S1_c = S3<2,1>::My_S1;   // ?
  return 0;
}

我得到的错误如下:

error: expected ‘;’ before ‘<’ token
using My_S1 = typename S2<A>::My_S1<B>;
                                   ^
error: expected unqualified-id before ‘<’ token

1 个答案:

答案 0 :(得分:4)

您必须明确告诉编译器S2<A>::My_S1是模板:

//                            vvvvvvvv-- here
using My_S1 = typename S2<A>::template My_S1<B>;