2017-02-28 181 views
2

我有一個vector3類,我需要實現不同的乘法選項(所以我重載了運算符*),這取決於im乘法的類型。重載運算符*

的問題是,在最後一節我得到的錯誤:

Description Resource Path Location Type 
ambiguating new declaration of 'Pang::vector3 Pang::operator*(const Pang::vector3&, const Pang::vector3&)' vector3.h /PangGame/src line 130  

C/C++問題

但我只有一個operator超載返回vector和muyltiplies 2 vector秒。

希望你能幫助(我只想澄清類載體3具有threee雙號),例如:vector3(double x, double y, double z);

friend vector3 operator* (const double& number, const vector3& vector) 
     { 
    vector3 result; 
    result.x = number*vector.x; 
    result.y = number*vector.y; 
    result.z = number*vector.z; 
    return result; 
     } 

friend vector3 operator* (const vector3& vector, const double& number) 
      { 
     vector3 result; 
     result.x = number*vector.x; 
     result.y = number*vector.y; 
     result.z = number*vector.z; 
     return result; 
      } 
//Scalar product: If a = a1i + a2j + a3k and b = b1i + b2j + b3k then 
// a · b = a1*b1 + a2*b2 + a3*b3 
friend double operator* (const vector3& vector1, const vector3& vector2) 
{ 
     double result; 
     result= (vector1.x)*(vector2.x)+(vector1.y)*(vector2.y) + (vector1.z)*(vector2.z); 
     return result; 
} 

/* Product: Vector x Vector 
    * Example: The cross product of a = (2,3,4) and b = (5,6,7) 

cx = aybz - azby = 3×7 - 4×6 = -3 
cy = azbx - axbz = 4×5 - 2×7 = 6 
cz = axby - aybx = 2×6 - 3×5 = -3 
Answer: a × b = (-3,6,-3)*/ 
friend vector3 operator* (const vector3& vector,const vector3& vector2) 
       { 
      vector3 result; 
      result.x = (vector.y)*(vector2.z) - (vector.z)*(vector2.y); 
      result.y = (vector.z)*(vector2.x) - (vector.x)*(vector2.z); 
      result.z = (vector.x)*(vector2.y) - (vector.y)*(vector2.x); 
      return result; 
       } 
+0

如果我沒有弄錯,你的兩個'operator *'函數具有相同的簽名(參數)。上次我嘗試過,C++不支持單獨返回類型的重載。 – domsson

回答

4

的問題是,你正在試圖超載operator*基於返回類型:

double operator* (const vector3& vector1, const vector3& vector2) 
vector3 operator* (const vector3& vector1, const vector3& vector2) 

這是不允許的,因爲重載考慮到函數簽名,其中does not include the return type

3.19 signature [defns.signature]

⟨function⟩ name, parameter-type-list, and enclosing namespace (if any)


一個可能的解決辦法,如果你想你的operator*到可能產生或者是double或其他vector3,你可以返回可轉換爲這些類型的代理類型:

struct vector3_multiplication_proxy { 
    vector3 lhs, rhs; 
    operator double() { return 0; /* Your inner product calculation here */ } 
    operator vector3() { return {}; /* Your cross product calculation here */ } 
}; 

vector3_multiplication_proxy operator* (const vector3& lhs, const vector3& rhs) { 
    return {lhs, rhs}; 
} 

這確實有一生的陷阱,並可能延遲計算取決於你如何使用它,所以它可能會或可能不會是一個好主意。在你的具體情況下,這可能是一個壞主意,因爲內在和交叉產品是不同的東西,應該用不同的語法來表示。