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

如何抛出模板参数类型的异常?抛出语句报错求助

搞定这个异常抛出的语法错误!

嘿,你遇到的这个expected primary-expression before ‘e’错误,根源就在throw Exc e;这行代码的写法上,完全是语法用错了~

为啥错了?

C++里throw关键字后面得跟一个已经构造好的异常对象实例,而不是Exc e这种像声明变量似的写法。编译器看到Exc e会懵:“你这是要声明变量?但这里我要的是一个能扔出去的对象啊!”所以就报了这个错。

怎么改?

根据你的需求,有两种靠谱的写法:

  • 扔个无参的异常对象
    如果你的Exc类型(比如默认的std::out_of_range)支持无参构造,或者你不需要给异常加说明,直接这么写就行:
throw Exc();
  • 带错误信息的异常(更推荐)
    像std::out_of_range这种标准异常,最好传点错误描述,方便调试时知道啥问题:
throw Exc("容器满啦,加不进新元素咯!");

给你改好的add函数参考

template<class TypeA, size_t tsize=100, class Exc=std::out_of_range>
class YourContainer { // 假设你有这么个容器类哈
private:
    size_t nelems = 0;
    size_t capac = tsize;
    TypeA* elems[tsize];
public:
    void add(TypeA* objA) {
        if(nelems == capac) {
            delete objA; // 这里提前释放对象做得很对,不然要内存泄漏啦
            throw Exc("容器容量已达上限,无法添加新元素");
        }
        elems[nelems++] = objA;
    }
};

额外碎碎念

  • std::out_of_range的构造函数支持传字符串(C++11之后也能传std::string),所以加个错误提示完全没问题。
  • 你在抛异常前delete objA的操作真的很细心,要是没这一步,传入的指针就因为异常扔出去而没人管了,妥妥的内存泄漏~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:33:22