2017-02-28 156 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}; 
} 

这确实有一生的陷阱,并可能延迟计算取决于你如何使用它,所以它可能会或可能不会是一个好主意。在你的具体情况下,这可能是一个坏主意,因为内在和交叉产品是不同的东西,应该用不同的语法来表示。