C++编译期递归解析类型:两种实现方法为何一成一败?
问题解答
核心成因
该编译错误由C模板的从属名称查找规则导致:
当你在模板内部引用一个依赖于模板参数的类成员(此处为Non_Working_Array<Dimension - 1, Type, Size>::type)时,C标准规定编译器默认会将这类成员判定为值而非类型,除非你显式使用typename关键字声明该成员是一个类型。
你给出的报错信息也明确提示了这一点:编译器把Non_Working_Array<(Dimension - 1), Type, Size>::type识别为值,而std::array的第一个模板参数要求传入类型,因此出现类型不匹配的错误。
为什么第一种实现可正常运行
第一种实现中你使用了decltype(ArrayType_Impl<Dim - 1, T, N>::type),decltype的作用就是推导表达式的类型,编译器此时可以明确你需要获取ArrayType_Impl内部type成员的类型,不需要额外加typename也能正确识别,因此不会出现类型判定错误。
第二种实现的修复方案
只需要在引用从属类型的位置前加typename关键字显式声明其为类型即可,修复后的代码如下:
template<std::size_t Dimension, typename Type, std::size_t Size> struct Non_Working_Array { // 新增typename关键字声明后面的::type是类型 using type = std::array<typename Non_Working_Array<Dimension - 1, Type, Size>::type, Size>; }; template<typename Type, std::size_t Size> struct Non_Working_Array<1, Type, Size> { using type = std::array<Type, Size>; };
内容的提问来源于stack exchange,提问作者SpaceFace102
相关产品推荐
相关产品推荐

