如何抛出模板参数类型的异常?抛出语句报错求助
搞定这个异常抛出的语法错误!
嘿,你遇到的这个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
相关产品推荐
相关产品推荐

