2017-02-28 30 views
2

私は乗算の種類に応じて異なる乗算オプションを実装する必要があるvector3クラスを用意しています。演算子のオーバーロード*

問題は、最後の一つに、私はエラーを取得することです:

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++の問題

しかし、私は一つだけoperatorvectorと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

私が間違っていない場合、あなたの2つの '演算子*'関数は同じ署名(引数)を持っています。前回私が試したとき、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}; 
} 

このあなたがそれを使用する方法に応じて生涯の落とし穴を持ち、計算を遅らせるかもしれないので、良いアイデアかもしれません。あなたの特定のケースでは、内側と外側の製品が異なるものであり、多分異なる構文で表示されるべきであるため、おそらく悪い考えです。

関連する問題