模板模板参数和模板别名:编译器错误?

Posted

技术标签:

【中文标题】模板模板参数和模板别名:编译器错误?【英文标题】:Template template parameter and template alias: compiler bug? 【发布时间】:2020-10-13 13:00:20 【问题描述】:

我对以下代表性示例代码有疑问:

模板
结构 X ;

模板
结构 Y ;

模板
结构 XX: X ;

模板
结构 YY: Y ;

模板

这段代码用 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,最终用户接受与ZXY)相同的模板模板参数,但将它们分派到内部类XX 和@ 987654329@ 通过派生XY 来修改它们的行为。

这个问题是编译器错误吗?如果是,是否有某种解决方法?

非常感谢!

【问题讨论】:

非常相似的问题:***.com/questions/62277828/… 不确定它是否符合重复的条件,但再次考虑它确实如此...... 【参考方案1】:

你需要告诉编译器Tpl是一个模板:

template<template<int> class TP>
struct W: Z<traits<TP>::template Tpl> ;
                   // ^^      

Afaik,这没有任何改变,我可能是某些编译器/已经对此更加松懈,让您在没有它的情况下侥幸逃脱。 需要它的原因类似于类型需要 typename 的原因:traits 可能有特化,其中 Tpl 不是模板,因此您需要告诉编译器它确实是模板。

【讨论】:

以上是关于模板模板参数和模板别名:编译器错误?的主要内容,如果未能解决你的问题,请参考以下文章

使用 char * 作为模板参数编译错误

编译器错误? g++ 允许可变大小的静态数组,除非函数是模板化的

Boost statechart - 使用状态图作为模板参数时的编译错误

深入理解函数模板

关于模板

C++模板进阶操作 —— 非类型模板参数模板的特化以及模板的分离编译