【发布时间】: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 来修改它们的行为。
这个问题是编译器错误吗?如果是,是否有某种解决方法?
非常感谢!
【问题讨论】:
-
不确定它是否符合重复的条件,但再次考虑它确实如此......
标签: c++ templates template-specialization template-templates template-aliases