如何正确将模板模板作为模板参数使用?
问题分析与解决
你的判断没错,A<T>::type确实是一个模板模板参数(即接受单个类型参数的模板),但编译器在处理依赖于模板参数T的名称时,需要明确区分它是类型还是模板——这里你误用了typename(用于标记依赖类型),而应该用template来标记依赖模板。
修正后的代码
把D的定义改成这样:
template <typename T> struct D { using type = typename C<A<T>::template type>::type; };
为什么这样改?
A<T>::template type:这里的template关键字告诉编译器,type是属于A<T>的一个模板(而非普通类型),这样就能匹配C要求的template <typename> class TT模板模板参数。- 外层的
typename依然需要,因为C<...>::type是依赖于模板参数的类型,必须用typename标记才能让编译器正确识别。
这样修改完全不需要改动A和B的结构,符合你的要求。
内容的提问来源于stack exchange,提问作者SergeyKuz1001
相关产品推荐
相关产品推荐

