2013-03-15 98 views
0

我正在研究Vector2D類,我認爲使用+ =/+運算符可以實現矢量加法和標量加法。如何使用+ =運算符實現標量和矢量加法?

麻煩的是,我真的不知道如何解決這個明顯的說法含糊不清,這裏是鏘這樣說:

vector2d_test.cpp:17:16: error: use of overloaded operator 
     '+=' is ambiguous (with operand types 'Vector2D<float>' and 'int') 
     vector += 1; 
     ~~~~~~^~~~~~~~ 
vector2d.hpp:34:18: note: candidate function 
    Vector2D<T>& operator+=(const Vector2D<T>& other) 
       ^
vector2d.hpp:41:18: note: candidate function 
    Vector2D<T>& operator+=(const T summand) const 

這裏有兩個功能:

Vector2D<T>& operator+=(const Vector2D<T>& other) 
{ 
    x += other.x; 
    y += other.y; 
    return *this; 
} 

template <typename S> 
Vector2D<T>& operator+=(const S summand) const 
{ 
    x += summand; 
    y += summand; 
    return *this; 
} 

所以..任何想法我能做些什麼?

回答

1

目前尚不清楚你想要做什麼的選擇隱式構造函數。除非他們是成員,否則您發佈的職能是不合法的。如果 他們的成員,和你有一樣的東西:

Vector2D<float> v; 
// ... 
v += 1; 

Vector2D<float>::operator+=(Vector2D<float> const&) 功能是不可調用的,所以不能有任何含糊。如果 的功能都沒有的成員,那麼他們就應該這樣寫:

template <typename T> 
Vector2D<T>& operator+=(Vector2D<T>& lhs, Vector2D<T> const& rhs); 
template <typename T, typename U> 
Vector2D<T>& operator+=(Vector2D<T>& lhs, U rhs); 

即使在這種情況下,第一不能與rhsint類型調用,因此不存在歧義。

編輯:

我錯過了const在你的帖子第二結束。 這是貴公司的明顯的錯字,它仍然不會改變任何東西 ,除非你還必須 Vector2D一些隱式轉換(這可能不是一個好主意);否則, 第一個版本仍然不可調用。如果有,例如, 隱式從intVector2D轉換,並且調用 +=上的非const的Vector2D,則第一過載是 爲隱式的第一個參數的更好匹配(其導致 的this指針),因爲它完全匹配,甚至不需要 一個cv轉換,但第二個函數是 第二個參數更好的匹配,因爲模板實例化結果 完全匹配。所以這個電話很模糊。

+1

模糊性必須來自'Vector2D '的構造函數'帶'int'。人們也觀察到第二個成員錯誤的「const」,導致我們得出結論,這絕對不是足夠的代碼。 – Puppy 2013-03-15 09:59:12

+0

@DeadMG虛假的'const'顯然是錯誤的,我忽略了它。 'operator + ='應該_never_是'const'。但是,正如我在編輯中指出的那樣,您仍然需要隱式轉換才能使調用不明確。 – 2013-03-15 10:05:15

+0

哎呀,這個常量實際上是問題:P – futlib 2013-03-15 12:03:19

2

你有全部寫在你的錯誤信息。你試圖添加到你的向量變量的int類型,但你的向量有浮動。它應該是:

vector += 1f; 

vector += 1.0; 

看看。當你有這樣的載體:對應於這個向量

Vector2D<float> vector; 

功能有頭:

Vector2D<T>& operator+=(const float summand) const; 

第二個沒有事現在。當您嘗試添加到您的矢量1,您試圖調用函數:

Vector2D<T>& operator+=(const int summand) const; 

你沒有宣佈。這就是爲什麼編譯器會給你一個錯誤 - 它找不到合適的功能。

0

最簡單的方式是定義的Vector2D翼內部的功能:

Vector2D& operator+=(const Vector2D& rhs) 
    { ...each this element += rhs's corresponding element... } 

Vector2D& operator+=(const T& summand) 
    { ...each this elements += summand... } 

friend Vector2D operator+(Vector2D lhs, const Vector2D& rhs) { return lhs += rhs; } 

friend Vector2D operator+(Vector2D lhs, const T& rhs) { return lhs += rhs; } 

注:

  • 非成員函數friend s,這允許它們被方便地定義內聯
  • 功能不應該是const(一個在你的問題)
  • 通常的轉換將被嘗試,所以如果Tfloat那麼除非你做一些有趣的事情int旨意工作得很好,比如一個Vector2D從單一int,使轉換曖昧
+0

這將如何使用單個參數? – juanchopanza 2013-03-15 09:58:46

+1

@juanchopanza正如他所說的,你在類中定義它(或者至少聲明它),所以它有一個類類型的隱式第一個參數。 – 2013-03-15 10:06:58

+0

@JamesKanze在編輯之前,它說:「將函數定義爲Vector2D中的朋友......」。 – juanchopanza 2013-03-15 10:54:27