【问题标题】:Having issues overloading "+,-,*" operators for vectors- "no match for operator..."为向量重载“+、-、*”运算符时遇到问题 - “运算符不匹配...”
【发布时间】: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&lt;int&gt; temp = op1 + op2。到目前为止没有任何效果。我什至尝试使用基本相同的代码创建一个公共函数std::vector&lt;int&gt; Add(std::vector&lt;int&gt; op1, std::vector&lt;int&gt; op2),但没有成功。

任何帮助将不胜感激!

【问题讨论】:

  • minimal reproducible example。鉴于您发布的代码片段,有人重建您的问题的可能性很小。
  • @BlackMoses 我会修改我的答案以涵盖这一点。其实应该已经有重复了
  • 我知道我不应该重载 std 类,或者我可以使用 stl 来实现这一点 -- std::vector 是一个 STL 容器,但你'重新使用它。
  • 这个想法是创建一个计算器,它可以加、减和乘以非常长的数字(例如长度为 4000)。 -- 那你为什么不创建一个“BigNumber”类并重载这个类的运算符?这比尝试使用原始向量作为operator +, -, * 等的参数来做到这一点更有意义。

标签: c++ vector operator-overloading


【解决方案1】:

您的代码无法编译,因为 friend 声明仅使名称可用于 argument-dependent lookup

由于参数在std 中,因此仅在std 中搜索运算符。您的函数不在std 中,因此找不到。

在尝试将运算符添加到 std 之前 - 不要,这是未定义的行为。

可以提供非朋友声明,以便在搜索封闭范围 (see example - credit to BlackMoses) 的常规查找步骤中找到名称。

但是从两个方面来说这是一个坏主意:

  1. 这些运算符的查找会不一致;例如考虑this modification of the above code - 如果在更窄的命名空间中找到运算符名称,它将永远不会到达封闭的命名空间。因此,您应该只进行运算符重载,以便 ADL 找到它们(即,至少一个操作数与重载的运算符函数位于同一类或命名空间中)。

  2. 无论如何,这都是对重载运算符的不良使用。如果合并您的代码的其他人不想要这些重载怎么办?他们对您班级的用户没有帮助。运算符重载的想法是为使用您的类的人提供直观的语法(在这种情况下为Calculator)。您可以只使用普通函数来实现类的成员函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-23
    • 2018-07-19
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    相关资源
    最近更新 更多