请考虑以下代码:
template <template <int> class T>
struct B {
};
template <int N>
struct A {
B<A> b;
};
这不会编译,因为A
中的B<A> b
引用了类A<N>
,而不是模板。如何从A
的正文中获取模板A<N>
?
答案 0 :(得分:2)
绕过这个问题的最简单方法,我认为:
template <int N>
struct A {
B<::A> b;
};
虽然这实际上是一个非常有趣的问题,因为B<A>
似乎应该有效。来自N3936的§14.6.1[temp.local] / p1:
与普通(非模板)类一样,类模板也有 注入类名(第9条)。注入类名可以用作 模板名称或类型名称。与它一起使用时 template-argument-list ,作为模板的 template-argument template-parameter ,或作为最终标识符 它的朋友类模板声明的 elaborated-type-specifier 指的是类模板本身。否则,它相当于 template-name 后跟类的 template-parameters 括在&lt;&gt;。
中的模板
所以似乎B<A>
应该等同于B<::A>
。 GCC 4.8 accepts OP中的代码,尽管Clang 3.4 doesn't。