嵌套类中的别名模板

我试图从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关键字作为模板名称。

链接地址: http://www.djcxy.com/p/82537.html

上一篇: aliased templates in nested classes

下一篇: C++ template typedef