将模板名作为类参数传递导致变参展开报错,是否为MSVC编译器Bug?
问题解答
结论
该问题不属于MSVC编译器Bug,是你的代码不符合C++标准规范导致的,GCC能编译通过属于非标准的宽松兼容行为。
原因说明
在HandleAllTypeImpl模板的定义场景下,TemplateName是模板参数,属于依赖名称,其具体类型需要等到模板实例化时才能确定,它内部嵌套的Impl是模板类型。C++标准明确规定:访问依赖类型的内部模板成员时,必须在模板成员名前添加template关键字,显式告知编译器后续跟的<是模板参数列表的起始标记,而非小于运算符。
你没有添加template关键字时,MSVC按照标准语法规则解析,会将Impl<Datas>中的<识别为小于运算符,因此抛出缺少逗号的语法错误。如果给GCC开启严格标准校验参数(如-pedantic-errors),GCC同样会触发对应的语法错误。
修正方案
将继承语句调整为如下形式即可在所有符合C++标准的编译器上正常编译:
/// 注:示例中原有Datas应为模板参数包Types的笔误,已同步修正 template<typename TemplateName, typename... Types> class HandleAllTypeImpl<TemplateName, std::tuple<Types...> > : public TemplateName::template Impl<Types>... {};
内容的提问来源于stack exchange,提问作者Crog
相关产品推荐
相关产品推荐

