【发布时间】:2017-02-03 04:26:45
【问题描述】:
我正在尝试重载向量的基本算术运算符。这个想法是创建一个计算器,可以加、减和乘以非常长的数字(例如长度为 4000)。当我添加两个向量时,我希望我的程序从两个向量的开头循环,添加值,然后将它们推送到第三个向量。我知道我不应该重载 std 类,或者我可以使用 stl 和 boost 来完成此任务,但我的项目不允许这样做。
我的主要问题是我的程序似乎无法识别我的重载运算符。这是一个代码sn-p:
来自
//calculator.h
class Calculator {
public:
....
void Solve();
friend std::vector<int> operator+(const std::vector<int> &op1, const std::vector<int> &op2);
friend std::vector<int> operator-(const std::vector<int> &op1, const std::vector<int> &op2);
friend std::vector<int> operator*(const std::vector<int> &op1, const std::vector<int> &op2);
}
和
//calculator.cpp
void Calculator::Solve() {
...
if(operation == '-') {
op1 = op1 - op2;
}
else if(operation == '+') {
op1 = op1 + op2;
}
else if(operation == '*') {
op1 = op1 * op2;
}
...
}
friend std::vector<int> operator+(const std::vector<int> &op1, const std::vector<int> &op2) {
std::vector<int> toreturn;
...
//use a couple loops to add vectors together
...
return toreturn;
}
当我使用 g++ (-v = 5.4, ubuntu 16.04) 编译时,出现以下错误:
error: no match for ‘operator-’ (operand types are ‘std::vector<int>’ and ‘std::vector<int>’)
polynomial1 = polynomial1 - polynomial2;
^
In file included from /usr/include/c++/5/vector:65:0,
from Calculator.h:18:
/usr/include/c++/5/bits/stl_bvector.h:208:3: note: candidate: std::ptrdiff_t std::operator-(const std::_Bit_iterator_base&, const std::_Bit_iterator_base&)
operator-(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y)
^
/usr/include/c++/5/bits/stl_bvector.h:208:3: note: no known conversion for argument 1 from ‘std::vector<int>’ to ‘const std::_Bit_iterator_base&’
In file included from /usr/include/c++/5/bits/stl_algobase.h:67:0,
from /usr/include/c++/5/vector:60,
from Calculator.h:18
我试图在全局范围内使向量重载(它们不适用于 Calculator 类的私有成员),试图使它们成为成员函数(使用单个参数 rhsObj 和 @987654327 @),设置 op1=op1+op2 为std::vector<int> temp = op1 + op2。到目前为止没有任何效果。我什至尝试使用基本相同的代码创建一个公共函数std::vector<int> Add(std::vector<int> op1, std::vector<int> op2),但没有成功。
任何帮助将不胜感激!
【问题讨论】:
-
minimal reproducible example。鉴于您发布的代码片段,有人重建您的问题的可能性很小。
-
@M.M 为什么会编译:coliru.stacked-crooked.com/a/f096610d01605e4c
-
@BlackMoses 我会修改我的答案以涵盖这一点。其实应该已经有重复了
-
我知道我不应该重载 std 类,或者我可以使用 stl 来实现这一点 --
std::vector是一个 STL 容器,但你'重新使用它。 -
这个想法是创建一个计算器,它可以加、减和乘以非常长的数字(例如长度为 4000)。 -- 那你为什么不创建一个“BigNumber”类并重载这个类的运算符?这比尝试使用原始向量作为
operator +, -, *等的参数来做到这一点更有意义。
标签: c++ vector operator-overloading