我对以下代表性示例代码有疑问:
模板<int I> 结构 X {}; 模板<int I> 结构 Y {}; 模板<int I> 结构 XX: X<I> {}; 模板<int I> 结构 YY: Y<I> {}; 模板<template<int> 类 TP> 结构特征; 模板<> 结构特征<X> { 模板<int I> 使用 Tpl=XX<I>; }; 模板<> 结构特征<Y> { 模板<int I> 使用 Tpl=YY<I>; }; 模板<template<int> 类 TP> 结构 Z {}; 模板<template<int> 类 TP> 结构 W: Z<traits<TP>::Tpl> {}; int main() { Z<特征<X>::Tpl> zx; Z<traits<Y>::Tpl> zy; W<X> wx; W<Y> 返回 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
YY
X
Y
这个问题是编译器错误吗?如果是,是否有某种解决方法?
非常感谢!