【问题标题】:C++ Template Operator Overload InstantiationC++ 模板运算符重载实例化
【发布时间】: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


    【解决方案1】:

    您的要求是可行的:converting constructors 在您的 Moment、Force、Distance 类中,例如Moment(const Force&amp; A, const Distance&amp; b) 类型的,将允许将 Forces 和 Distances 提供给 Moment 对象。

    您的代码在operator^ 声明中包含过多的const 关键字。 下面是编译的代码;我冒昧地将operator^ 设为一个外部函数,这样它就可以像正确的二元运算符一样接受2 个参数。 为了实用起见,我还将您的 Vector3D 类转换为 struct (实际上不需要在这里封装)。

    #include <iostream>
    
    using namespace std;
    
    //Vector3D.h
    template <typename T>
    struct Vector3D
    {
        // data member
        T m_elem[3];
    
        // member functions
        Vector3D(const T& a, const T& b, const T& c): m_elem{a, b, c} {}
    
        template <typename Arg1, typename Arg2>
        friend Vector3D<double> operator^(const Vector3D<Arg1>& p_right, const Vector3D<Arg2>& p_left);
    };
    
    //Vector3D.cpp
    // Calculate the cross product
    template <typename Arg1, typename Arg2>
    Vector3D<double> operator^(const Vector3D<Arg1>& p_right, const Vector3D<Arg2>& p_left)
    {
        // Local variable
        Vector3D<double> cross_product(0,0,0);
    
        // Calculation
        cross_product.m_elem[0] = p_left.m_elem[1] * p_right.m_elem[2] - p_left.m_elem[2] * p_right.m_elem[1];
        cross_product.m_elem[1] = p_left.m_elem[2] * p_right.m_elem[0] - p_left.m_elem[0] * p_right.m_elem[2];
        cross_product.m_elem[2] = p_left.m_elem[0] * p_right.m_elem[1] - p_left.m_elem[1] * p_right.m_elem[0];
    
        return cross_product;
    }
    
    
    int main()
    {
        Vector3D<double> a(8, 9, 0);
        Vector3D<double> b(18, 94, -50);
        Vector3D<double> cross = a^b;
    
        cout << "cross product is: [" << cross.m_elem[0] << ", "
             << cross.m_elem[1] << ", " << cross.m_elem[2] << "]\n";
    
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      • 1970-01-01
      相关资源
      最近更新 更多