嵌套类中的别名模板
aliased templates in nested classes
我正试图从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定义。
这里的正确语法是什么?如果我能得到U2的定义,而不用用到U1,那就更好了
您需要使用template
消歧符告诉编译器将T2
解析为模板的名称(随后的<
和>
作为相应模板参数的分隔符):
template<typename A, typename B>
using U2=typename U1<A>::template T2<B>;
// ^^^^^^^^
下面是一个编译的实例。
在这里您可以找到关于何时应该使用template
消歧器(以及typename
消歧器,尽管您似乎知道那一个)的更多信息。
当编译器编译以下代码时:
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
之前使用template
关键字来显式地告诉编译器T1
将成为模板名称。
相关文章:
- 嵌套在类中时无法设置成员数据
- 无法访问嵌套类.类的使用无效
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 在C++中搜索嵌套多映射值
- 在C++中将矢量转换为嵌套地图
- C++嵌套if语句,基本货币交换
- 在nlohmann json中,如何将嵌套对象的数组转换为嵌套结构的向量
- 嵌套的匿名命名空间
- 了解嵌套循环打印星号图案
- 如何使用boost::具有嵌套结构和最小代码更改的序列化
- 嵌套for循环C++的问题(初学者)
- 嵌套模板类型的别名
- C++对名称空间和别名的混淆:没有嵌套和使用指令
- 解耦嵌套类:使用模板别名时出现"模板声明冲突"错误
- 对嵌套类使用类型别名
- C++使用别名访问嵌套类型(使用 vs typedef)
- VC++2013 中嵌套可变参数模板化结构的别名
- 嵌套类中的别名模板