You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 02:54:05