我有一个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,两个vector
s。
希望您可以提供帮助(只是澄清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};
}
这确实具有终身陷阱,并且可能会根据您的使用方式延迟计算,因此它可能是一个好主意。在您的特殊情况下,这可能是一个坏主意,因为内部和跨产品是不同的事物,可能应用不同的语法表示。