CLion 2022.1.1 Clangd报no matching 'operator new'错误如何修复
该问题是Clangd 15.0.0版本的已知解析缺陷:针对部分目标架构(含RISC-V 32位)做头文件依赖裁剪时,误删了标准库模板内部依赖的<new>头隐式引入逻辑,才会在调用push_back、make_shared等使用placement new的标准库接口时报错,无需手动给所有源码文件加#include <new>,以下三种方案均可直接修复:
全局IDE配置修复(单设备使用推荐)
打开CLion设置,进入Settings > Languages & Frameworks > C/C++ > Clangd配置页,在「Clangd 附加参数」输入框中添加参数:--extra-arg=-include=new
该参数会让Clangd解析所有C++文件时自动引入<new>头,完全不侵入项目代码。参数添加完成后点击配置页下方的「Restart Clangd」按钮重启服务,报错会立即消失。
之前尝试添加--target=riscv32不生效,是因为该参数仅修正目标架构识别逻辑,不会补全缺失的隐式头文件依赖,和本次报错根因不匹配。替换内置Clangd版本(兼容性优先推荐)
如果添加全局参数后出现其他解析异常,可以直接替换CLion 2022.1.1内置的Clangd 15版本:- 下载Clangd 14.0.6稳定版二进制包,解压到本地无中文、无空格的固定目录
- 回到Clangd配置页,取消勾选「Use Clangd from toolchain」选项
- 在Clangd路径选择栏选中解压得到的clangd可执行文件,保存设置后重启IDE即可,Clangd 14版本不存在该解析缺陷。
项目级配置修复(团队协作推荐)
在项目根目录新建名为.clangd的配置文件,写入如下内容:CompileFlags: Add: [-include=new]该配置仅对当前项目生效,提交到代码仓库后,所有使用Clangd作为代码解析引擎的开发者拉取代码后都会自动应用该配置,无需每个人单独修改IDE设置,也不需要改动业务代码。
内容的提问来源于stack exchange,提问作者Olivier Naud-Dulude

