超载操作员 *

Overloading operator *

本文关键字:操作员 超载      更新时间:2023-10-16

我有一个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 问题

但是我只有一个operator重载,返回vector和Muyltigh,两个vectors。

希望您可以提供帮助(只是澄清class vector 3具有threee double数字)ex: 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;
                 }

问题是您正在尝试基于返回类型来超载 operator*

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

这是不允许的,因为超载分辨率考虑了函数签名,该函数不包括返回类型:

3.19签名[defns.signature]

function⟩名称,参数类型列表和封闭名称空间(如果有)


一个可能的解决方案,如果您确实希望您的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};
}

这确实具有终身陷阱,并且可能会根据您的使用方式延迟计算,因此它可能是一个好主意。在您的特殊情况下,这可能是一个坏主意,因为内部和跨产品是不同的事物,可能应用不同的语法表示。