【发布时间】:2020-10-04 02:40:36
【问题描述】:
希望为模板 Vector3D 类实现叉积运算符^ oveload,理想情况下,重载(尽管我认为极不可能/不可能)应该能够接收两种不同的参数类型并返回第三个 s.t.
Vector3D<Distance> r;
Vector3D<Force> F;
Vector3D<Moment> M = r^F;
由于我认为这是不可能和/或不可能的,因此我愿意强制返回参数类型为 double s.t.
Vector3D<Distance> r;
Vector3D<Force> F;
Vector3D<double> M = r^F;
但是,当我在下面的代码中执行此操作时,即使模板类 Vector3D 已实例化,也会出现以下链接错误:
1>Source.obj : error LNK2019: unresolved external symbol "public: class
Vector3D<double> const __thiscall Vector3D<double>::operator^<double>(class
Vector3D<double> const &)const " (??$?TN@?$Vector3D@N@@QBE?
我如何去实例化 operator^ s.t. 的所有必需用法。我可以执行以下数据类型操作:
//Vector3D<double> = Vector3D<double> ^ Vector3D<double> or
//Vector3D<double> = Vector3D<Distance> ^ Vector3D<Force> or
//Vector3D<Moment> = Vector3D<Distance> ^ Vector3D<Force> (ideal!!!)
提前感谢您的帮助。
//Vector3D.h
template <typename T>
class Vector3D
{
public:
'''
template <typename Arg>
const Vector3D<double> operator^ (const Vector3D<Arg>& p_other) const;
'''
private:
//////////////////////////////////////////////////////////////////////////
// *** PRIVATE DATA MEMBERS ***
//////////////////////////////////////////////////////////////////////////
T m_elem[3];
}
//Vector3D.cpp
/// Calculate the cross product
//
template <typename T>
template <typename Arg>
const Vector3D<double> Vector3D<T>::operator^ (const Vector3D<Arg>& p_right) const
{
// Local variables
Vector3D<T> left(*this);
Vector3D<double> cross_product;
// Calculation
cross_product.m_elem[0] = left.m_elem[1] * p_right.m_elem[2] - left.m_elem[2] * p_right.m_elem[1];
cross_product.m_elem[1] = left.m_elem[2] * p_right.m_elem[0] - left.m_elem[0] * p_right.m_elem[2];
cross_product.m_elem[2] = left.m_elem[0] * p_right.m_elem[1] - left.m_elem[1] * p_right.m_elem[0];
return cross_product;
}
template class Vector3D<double>;
【问题讨论】:
标签: c++ templates operator-overloading