如何实现支持算术运算的C++模板栈,解决C2679+=运算符匹配错误
C2679错误修复方案
错误根因
Values类拷贝构造函数参数为非常量左值引用,无法绑定临时对象(右值),传值调用+=等运算符时拷贝构造失败,导致编译器找不到匹配的运算符实现- 自定义
Stack类的+=等算术赋值运算符参数为非常量左值引用,同样无法接收临时对象作为入参 Values类的+/-等二元算术运算符返回局部栈变量的引用,属于悬空引用,运行时会触发未定义行为- 重载运算符接收指针参数的设计不符合C++常规语义,容易和原生指针运算冲突,不推荐使用
具体修改方法
1. 修正Values类的const正确性
将拷贝构造函数、所有接收Values类型参数的成员函数的入参改为常量左值引用,满足右值绑定要求:
// 拷贝构造函数修改 Values(const Values& v) { asgn(v); }; // asgn、sumt、subt、mult、divt等函数的Values参数修改示例 Values& asgn(const Values& value) { this->value[0] = value[0]; this->value[1] = value[1]; this->value[2] = value[2]; return *this; }; Values& sumt(const Values& value) { this->value[0] += value[0]; this->value[1] += value[1]; this->value[2] += value[2]; return *this; }; // 其余函数按同样规则修改即可
2. 修正Stack类的运算符参数
将所有算术赋值运算符的入参改为常量左值引用:
T& operator+=(const T& other) {s.top() += other; return s.top(); } T& operator-=(const T& other) {s.top() -= other; return s.top(); } T& operator*=(const T& other) {s.top() *= other; return s.top(); } T& operator/=(const T& other) {s.top() /= other; return s.top(); }
3. 修复二元运算符悬空引用问题
二元算术运算符不要返回引用,直接返回值对象,同时修改对应的add/sub/mul/div函数返回值:
// 运算符修改示例 Values operator+(const Values& value) const { return add(value); }; // add函数修改示例 Values add(const Values& value) const { Values v; v[0] = this->value[0] + value[0]; v[1] = this->value[1] + value[1]; v[2] = this->value[2] + value[2]; return v; }; // 其余二元运算符和对应实现函数按同样规则修改
优化建议
删除所有接收Values*指针参数的运算符重载,需要操作指针对象时手动解引用*指针后再传入,避免语义混淆。
完成上述修改后,代码即可正常编译,不会再触发C2679错误。
内容的提问来源于stack exchange,提问作者lostbits
相关产品推荐
相关产品推荐

