c++ - C++模板运算符重载实例化

标签 c++ templates operator-overloading

希望为模板Vector3D类实现跨乘运算符^ oveload,理想情况下,重载(尽管我认为高度不可能/不可能)应该能够接收两种不同的参数类型并返回第三个s.t。

Vector3D<Distance> r;
Vector3D<Force> F;
Vector3D<Moment> M = r^F;
因为我认为这是不可能和/或不可能的,所以我愿意强制返回参数类型为doubles.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>;

最佳答案

您所要求的是可行的:MomentForceDistance类中的converting constructors,例如类型Moment(const Force& A, const Distance& b),将允许将ForceDistance馈送到Moment对象。
您的代码在const声明中有太多的operator^关键字。
下面是编译的代码;我已经自由地将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;
}

关于c++ - C++模板运算符重载实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64190695/

相关文章:

c++ - 将两个 Mat 图像合并为一个

c++ - 包括模板函数

c++ - 使用 cuda cuFFT 从复数转换为实数时输出不正确

c++ - 如何创建一个Linux共享库,将所有二进制依赖项包含到一个so文件中?

c++ - 为什么编译器不能从模板中推导出类型,例如 template<typename R(typename... Args)>?

c++ - 类构造函数、析构函数和运算符重载的实用函数

c++ - std::enable_if 的两个版本有什么区别

c++ - 对具有 C++ 模板方法的函数的 undefined reference

c++ - 使用不同的参数重载运算符两次

c++ - 运算符 != 不匹配(操作数类型为指针和对象)