2016-09-25 38 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)。你可以使用普通函數來實現你的類的成員函數。