C2679错误:二元运算符'-='无匹配接受'T'类型右操作数的运算符
解决C2679错误:Static3Vector类'-='运算符重载问题
嘿,我一眼就看到你代码里的问题啦,这个C2679错误是因为你在重载-=运算符时,对this指针的使用方式不对。
错误原因分析
你在operator-=函数里写了这行代码:
this[i] -= rhs[i];
这里的this是指向当前Static3Vector对象的指针,不是对象本身。当你用this[i]的时候,编译器会把它解释成「指针数组的第i个元素」,而不是调用你重载的[]运算符来访问当前对象的坐标。这就导致编译器找不到合适的二进制运算符来匹配这个操作,直接抛出C2679错误。
修正方案
你需要先把this指针解引用成对象,再调用[]运算符,也就是把this[i]改成(*this)[i]。另外还有两个小优化建议:
- 复合赋值运算符(比如
-=)通常返回对象的引用(Static3Vector&),这样可以支持链式调用,效率也更高; - 因为你的类是固定3维向量,直接写循环次数
3比用sizeof(m_coords)/sizeof(m_coords[0])更直观,避免不必要的计算。
修正后的operator-=函数如下:
Static3Vector& operator -= (const Static3Vector& rhs) { for (int i = 0; i < 3; i++) (*this)[i] -= rhs[i]; return *this; }
测试验证
现在再运行你的测试代码:
Static3Vector<int> vec1(1,2,3); Static3Vector<int> vec2(1,2,3); vec1 -= vec2;
vec1的三个坐标都会正确减为0,不会再触发C2679错误啦。
内容的提问来源于stack exchange,提问作者SzymonO
相关产品推荐
相关产品推荐

