模板模板参数和模板别名:编译器错误?
Posted
技术标签:
【中文标题】模板模板参数和模板别名:编译器错误?【英文标题】:Template template parameter and template alias: compiler bug? 【发布时间】:2020-10-13 13:00:20 【问题描述】:我对以下代表性示例代码有疑问:
模板结构 X ; 模板 结构 Y ; 模板 结构 XX: X ; 模板 结构 YY: Y ; 模板 类 TP> 结构特征; 模板 结构特征 模板 使用 Tpl=XX; ; 模板 结构特征 模板 使用 Tpl=YY; ; 模板 类 TP> 结构 Z ; 模板 类 TP> 结构 W: Z ::Tpl> ; int main() Z::Tpl> zx; Z ::Tpl> zy; W wx; W 返回 1;
这段代码用 icc-19.0.0 编译得很好(似乎用 msvc-19.24 编译),但用 gcc-10.1、clang-10.0.0 和 icc-18.0.0 编译失败。
使用 gcc-10.1,错误信息是:
<source>:32:28: error: type/value mismatch at argument 1 in template parameter list for 'template<template<int <anonymous> > class TP> struct Z'
32 | struct W: Z<traits<TP>::Tpl> ;
| ^
<source>:32:28: note: expected a class template, got 'traits<TP>::Tpl'
上下文:我有一个模板类Z
,它有一个模板模板参数。我想从中派生一个类W
,最终用户接受与Z
(X
或Y
)相同的模板模板参数,但将它们分派到内部类XX
和@ 987654329@ 通过派生X
和Y
来修改它们的行为。
这个问题是编译器错误吗?如果是,是否有某种解决方法?
非常感谢!
【问题讨论】:
非常相似的问题:***.com/questions/62277828/… 不确定它是否符合重复的条件,但再次考虑它确实如此...... 【参考方案1】:你需要告诉编译器Tpl
是一个模板:
template<template<int> class TP>
struct W: Z<traits<TP>::template Tpl> ;
// ^^
Afaik,这没有任何改变,我可能是某些编译器/已经对此更加松懈,让您在没有它的情况下侥幸逃脱。
需要它的原因类似于类型需要 typename
的原因:traits
可能有特化,其中 Tpl
不是模板,因此您需要告诉编译器它确实是模板。
【讨论】:
以上是关于模板模板参数和模板别名:编译器错误?的主要内容,如果未能解决你的问题,请参考以下文章
编译器错误? g++ 允许可变大小的静态数组,除非函数是模板化的