VS2022中C++模板内别名模板编译报错求助
在Visual Studio 2022中编译C++模板代码的报错问题
报错代码片段
template <int N> struct A { }; template <typename T0> struct B { template <typename T1> using C = T1; }; template <int N> struct D { using E = A<N>; template <typename T2> using F = typename B<E>::C<T2>; // 报错行 };
编译错误信息
Error C2988 unrecognizable template declaration/definition Error C2059 syntax error: '<' Error C2238 unexpected token(s) preceding ';'
问题说明
上述代码是从更复杂的项目结构中提取的简化片段,在Visual Studio 2022的不同子版本中编译均会触发上述错误,即使已经添加了typename关键字也无法解决。
解决方案
需要在嵌套模板别名C前添加template关键字,明确告知编译器C是一个模板,修改后的报错行代码如下:
template <typename T2> using F = typename B<E>::template C<T2>;
原因解释
由于B<E>是依赖于模板参数N的类型(E是A<N>,而N是D的模板参数),编译器无法自动推断B<E>::C是模板别名还是普通成员。此时必须显式使用template关键字,才能让编译器正确解析后续的<T2>模板参数列表,避免语法解析错误。
内容的提问来源于stack exchange,提问作者Symon
相关产品推荐
相关产品推荐

