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

以右值获取std::array大小为何GCC9编译通过GCC11报错?

问题根源

这个报错是全局变量名和标准库模板类名重名+GCC 11对模板内非依赖名称查找规则执行更严格共同导致的:

  • 你的全局变量命名为array,和std::array模板类同名
  • 模板函数parse中的array属于非依赖名称(不依赖模板参数string_type),会在模板定义阶段完成名称查找:
    • GCC 9.3.0的查找逻辑优先匹配到了全局作用域的变量array,可以正常调用成员函数size()
    • GCC 11.2.0的查找逻辑优先匹配到了引入的std::array类名,此时编译器会将array.size()错误解析为调用std::array的静态成员函数size,并隐式传入全局变量array的地址作为参数,因此会报「期望0参数,实际传入1个参数」的错误。

修复方案

两种方案任选其一即可:

  1. 给全局变量改名,避免和标准库名称冲突,比如改成arr:
#include<array>
#include<cstdint>

const std::array<int, 3> arr{0, 1 , 2};

template<class string_type>
auto parse(string_type&& name) {
        const auto s = std::uint8_t{arr.size()};
        return s;
}
  1. 访问全局变量时显式指定全局作用域,明确告诉编译器要找的是全局变量而非std::array类名:
template<class string_type>
auto parse(string_type&& name) {
        const auto s = std::uint8_t{::array.size()};
        return s;
}

内容的提问来源于stack exchange,提问作者a_random_user

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 22:54:07