嵌套类中的别名模板
我试图从C的一个实例开始为T2<B>
获取一个模板别名。
template<typename A>
struct T1
{
template<typename B>
struct T2{};
};
template<typename A>
class C
{
T1<A> t;
};
template<typename A>
using U1=decltype(C<A>::t);
template<typename A, typename B>
using U2=typename U1<A>::T2<B>;
我用gcc 4.8得到编译器失败:
gg.cc:18:28: error: expected ‘;’ before ‘<’ token
using U2=typename U1<A>::T2<B>;
我在每个明智的位置使用了typename关键字,但无法获得U2定义进行编译。
这里的正确语法是什么? 如果我可以在不借助U1的情况下得到U2的定义,那将会更好。
您需要使用template
消歧器来告诉编译器将T2
解析为模板的名称(以及随后的<
和>
作为相应模板参数的分隔符):
template<typename A, typename B>
using U2=typename U1<A>::template T2<B>;
// ^^^^^^^^
这是一个编译生动的例子。
在这里你可以找到更多关于何时应该使用template
消歧器(以及typename
disambiguator,尽管你似乎知道那个)的更多信息。
当编译器编译以下内容时:
template<typename A, typename B>
using U2=typename U1<A>::T2<B>;
在它读取嵌套名称说明符U1<A>::
,它不知道它所在的U1
哪个特化,因为A
是未知的。 每个U1
专业化可能完全不同,并且取决于A
是什么。 所以它不知道T1
是什么样的名字。 特别是它不知道它是否是模板名称。 (例如U1<int>::T1
可能与U1<char>::T1
完全不同。)
出于这个原因,你需要明确地告诉编译器T1
将在T1
之前使用template
关键字作为模板名称。
上一篇: aliased templates in nested classes
下一篇: C++ template typedef