我是一位机械工程师,试图创建具有物理类型(距离,力,力矩,加速度,速度等)以及一些支持这些类型的 vector 数学(模板Vector3D)的仿真库。除了要对运算符'^'重载的叉积外,对于正常的 vector 运算而言,一切都进行得很顺利。叉积运算采用两种不同的类型,并返回第三个示例,请参见下文。Vector3D<Moment> = Vector3D<Distance> ^ Vector3D<Force>;Vector3D<Acceleration> = Vector3D<AngularAcceleration> ^ Vector3D<Velocity>;Vector3D<Velocity> = Vector3D<AngularVelocity> ^ Vector3D<Distance> etc. etc.现在,理想情况下,我希望不基于返回类型和输入参数为'^'操作数重载设置其他方法。现在,我知道下面的代码无法正常工作,因为您无法使用三个不同的模板进行经典的运算符重载,并且编译器将不知道该怎么办。template <typename T, typename U, typename V>Vector3D<T> operator^ (const Vector3D<U>& p_left, const Vector3D<V>& p_right)确实,我收到以下编译错误C2593:'运算符^'是不明确的。我想知道是否有一些类型推断和/或实例化可以在这里得到很好的利用,尽管我已经做过一些在线阅读,但似乎没有什么适合手头的具体要求。我认为我需要构造函数来进行类型转换,但是仅凭此点还不够/// Constructor/// \param p_value Moment arm/// \param p_unit Force//Moment(Distance p_radius, Force p_force);/// Constructor/// \param p_omega Magnitude of angular velocity/// \param p_velocity Magnitude of linear velocity//Acceleration(AngularVelocity p_omega, Velocity p_velocity);/// Constructor/// \param p_value Angular velocity/// \param p_unit RadiusVelocity(AngularVelocity p_omega, Distance p_radius);您的这方面的帮助将对我有很大帮助,因为编程仍然是我一直在学习的 Realm ...有关我的Vector3D 类的更多信息,请参见下面。先感谢您!//Vector3D.htemplate <typename T>class Vector3D{public: ////////////////////////////////////////////////////////////////////////// // *** CONSTRUCTORS *** ////////////////////////////////////////////////////////////////////////// /// Default Constructor // Vector3D(void); /// External initialization Constructor // Vector3D(const T& p_x, const T& p_y, const T& p_z); ////////////////////////////////////////////////////////////////////////// // *** DESTRUCTOR *** ////////////////////////////////////////////////////////////////////////// /// Destructor // ~Vector3D(void); template <typename U, typename V> friend Vector3D<T> operator^ (const Vector3D<U>& lhs, const Vector3D<V>& rhs);'''private://////////////////////////////////////////////////////////////////////////// *** PRIVATE DATA MEMBERS ***//////////////////////////////////////////////////////////////////////////T m_elem[3];}//Vector3D.cpp/// Calculate the cross product//template <typename T, typename U, typename V>Vector3D<T> operator^ (const Vector3D<U>& p_left, const Vector3D<V>& p_right){ Vector3D<T>cross_product; // Calculation cross_product.m_elem[0] = T(p_left.m_elem[1], p_right.m_elem[2]) - T(p_left.m_elem[2], p_right.m_elem[1]); cross_product.m_elem[1] = T(p_left.m_elem[2], p_right.m_elem[0]) - T(p_left.m_elem[0], p_right.m_elem[2]); cross_product.m_elem[2] = T(p_left.m_elem[0], p_right.m_elem[1]) - T(p_left.m_elem[1], p_right.m_elem[0]); return cross_product;}template class Vector3D<double>;template class Vector3D<double>;template class Vector3D<Numeric>;template class Vector3D<Force>;template class Vector3D<Acceleration>;template class Vector3D<Velocity>;template class Vector3D<Distance>;template class Vector3D<Moment>;template class Vector3D<AngularAcceleration>;template class Vector3D<AngularVelocity>;template class Vector3D<Angle>; 最佳答案 主要问题是:叉积运算符的实现中的T类型是什么?这就是产生歧义的地方。刚开始时,您可能想用乘法运算符而不是构造函数来替换构造函数,即 Moment operator*(Distance p_radius, Force p_force);代替 Moment(Distance p_radius, Force p_force);这使您可以从模板参数中以尾随的返回类型推断出返回类型。然后,您的运算符可能如下所示: template<typename U, typename V>auto operator^(const Vector3D<U>& left, const Vector3D<V>& right) -> Vector3D<decltype(std::declval<U>() * std::declval<V>())>{ return { left.m_elem[1] * right.m_elem[2] - left.m_elem[2] * right.m_elem[1], left.m_elem[2] * right.m_elem[0] - left.m_elem[0] * right.m_elem[2], left.m_elem[0] * right.m_elem[1] - left.m_elem[1] * right.m_elem[0] };}关于c++ - C++运算符重载中的类型推断,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/64951110/ 10-10 21:24