2016-09-25 88 views
1

我试图重载向量的基本算术运算符。这个想法是创建一个计算器,它可以增加,减少和乘以很长的数字(例如长度为4000)。当我添加两个向量时,我希望我的程序从两个向量开始循环,添加值,然后将它们推送到第三个向量。我知道我不应该重载std类,或者我可以使用stl和boost来完成这个任务,但是我的项目不允许这样做。有问题重载“+, - ,*”运算符的向量 - “不匹配的运算符...”

我的主要问题是我的程序似乎无法识别我的重载操作符。这里的一个代码段:

//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; 
} 

当我克编译++(-v = 5.4,ubuntu的16.04),I得到以下错误:

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 

我试图让矢量重载全球范围(他们不适用于计算器类的私人成员),在试图使它们成员函数(使用单个参数rhsObjthis),将op1 = op1 + op2设置为std::vector<int> temp = op1 + op2。到目前为止没有任何工作。我甚至尝试使用基本相同的代码制作公共功能std::vector<int> Add(std::vector<int> op1, std::vector<int> op2),但它没有奏效。

任何帮助将不胜感激!

+2

[mcve]。鉴于您发布的代码片段,有人很少有人重建您的问题。 –

+0

@ M.M为什么这样编译:http://coliru.stacked-crooked.com/a/f096610d01605e4c – xinaiz

+0

@BlackMoses我会修改我的答案来掩盖这一点。其实应该有一个重复 –

回答

4

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

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

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

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

然而,这是一个坏主意,有两种方式:

  1. 这些运营商的查询会出现不一致;例如考虑this modification of the above code - 如果在较窄的名称空间中找到运算符名称,它永远不会到达封闭的名称空间。正因为如此,您应该只允许操作符重载,以使它们可以通过ADL找到(即至少一个操作数与重载的操作符函数在同一个类或名称空间中)。

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