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

带虚析构函数的类使用模板化operator delete时的编译报错问题

模板化operator delete无法用于常规delete操作的原因

首先看你给出的类定义代码:

struct S
{
    virtual ~S() {}
    template <typename... Args>
    void operator delete(void* ptr, Args... args);
};

使用g++编译时会报错:

error: no suitable 'operator delete' for 'S'

问题解答

是的,用于常规delete操作的operator delete不能是模板。

C++标准明确规定,执行常规delete表达式(比如delete p;)时,编译器只会寻找非模板版的operator delete函数。模板化的operator delete不会被纳入常规delete操作的候选范围——哪怕模板的参数包可以推导为空也不行。

模板版本的operator delete是为带额外参数的delete场景设计的(比如配合放置new使用的delete(p, args...)),和常规无参数的delete操作是两个不同的重载匹配分支。

如果要让类S支持常规delete操作,必须额外提供一个非模板的operator delete重载,示例如下:

struct S
{
    virtual ~S() {}
    // 适配常规delete的非模板版本
    void operator delete(void* ptr) {
        // 这里可以自定义内存释放逻辑,或者调用全局delete
        ::operator delete(ptr);
    }
    // 模板版本用于带额外参数的delete场景
    template <typename... Args>
    void operator delete(void* ptr, Args... args);
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 03:57:21