【问题标题】: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 来修改它们的行为。

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

非常感谢!

【问题讨论】:

标签: c++ templates template-specialization template-templates template-aliases


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    相关资源
    最近更新 更多