Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的类型推断+;操作员过载_C++_Templates_Operator Overloading_Type Inference - Fatal编程技术网

C++ C+中的类型推断+;操作员过载

C++ C+中的类型推断+;操作员过载,c++,templates,operator-overloading,type-inference,C++,Templates,Operator Overloading,Type Inference,我是一名机械工程师,试图创建一个包含物理类型(距离、力、力矩、加速度、速度等)以及一些向量数学(模板Vector3D)的仿真库,以支持这些类型。除了我想对操作符“^”应用重载的叉积之外,法向量运算的一切都进行得很顺利。跨积操作接受两种不同的类型,并返回第三种类型。有关示例列表,请参见下文 Vector3D<Moment> = Vector3D<Distance> ^ Vector3D<Force>; Vector3D<Acceleration> =

我是一名机械工程师,试图创建一个包含物理类型(距离、力、力矩、加速度、速度等)以及一些向量数学(模板Vector3D)的仿真库,以支持这些类型。除了我想对操作符“^”应用重载的叉积之外,法向量运算的一切都进行得很顺利。跨积操作接受两种不同的类型,并返回第三种类型。有关示例列表,请参见下文

Vector3D<Moment> = Vector3D<Distance> ^ Vector3D<Force>;
Vector3D<Acceleration> = Vector3D<AngularAcceleration> ^ Vector3D<Velocity>;
Vector3D<Velocity> = Vector3D<AngularVelocity> ^ Vector3D<Distance> etc. etc.
你在这件事上的帮助将对我有很大帮助,因为编程仍然是我不断学习的领域。。。有关我的类Vector3D的更多信息,请参见下文。提前谢谢你

//Vector3D.h
template <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>;
//Vector3D.h
模板
类向量3D
{
公众:
//////////////////////////////////////////////////////////////////////////
//***施工人员***
//////////////////////////////////////////////////////////////////////////
///默认构造函数
//
向量3d(void);
///外部初始化构造函数
//
Vector3D(常数T&p_x、常数T&p_y、常数T&p_z);
//////////////////////////////////////////////////////////////////////////
//***析构函数***
//////////////////////////////////////////////////////////////////////////
///析构函数
//
~Vector3D(void);
模板
friend Vector3D操作符^(常量Vector3D和lhs、常量Vector3D和rhs);
'''
私人:
//////////////////////////////////////////////////////////////////////////
//***私人数据成员***
//////////////////////////////////////////////////////////////////////////
T m_elem[3];
}
//Vector3D.cpp
///计算叉积
//
模板
向量3D操作符^(常量向量3D&p_左,常量向量3D&p_右)
{
向量3叉积;
//算计
交叉积m_元素[0]=T(p_left.m_元素[1],p_right.m_元素[2])-T(p_left.m_元素[2],p_right.m_元素[1]);
交叉积m_元素[1]=T(p_left.m_元素[2],p_right.m_元素[0])-T(p_left.m_元素[0],p_right.m_元素[2]);
交叉积m_元素[2]=T(p_left.m_元素[0],p_right.m_元素[1])-T(p_left.m_元素[1],p_right.m_元素[0]);
返回交叉产品;
}
模板类Vector3D;
模板类Vector3D;
模板类Vector3D;
模板类Vector3D;
模板类Vector3D;
模板类Vector3D;
模板类Vector3D;
模板类Vector3D;
模板类Vector3D;
模板类Vector3D;
模板类Vector3D;

主要问题是:在跨积运算符的实现中,
T
的类型是什么?这就是产生歧义的原因

首先,您可能希望将构造函数替换为乘法运算符,而不是构造函数,即

力矩算符*(距离p_半径,力p_力);
而不是

力矩(距离p_半径,力p_力);
这允许您从尾部返回类型中的模板参数推断返回类型。然后,您的操作员可能会如下所示:

模板
自动运算符^(常量向量3D和左、常量向量3D和右)
->矢量3D
{
返回
{
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]
};
}

您的机组是否已经有
操作员*
过载?如果
Distance*Force
已经返回了一个
力矩
,我认为应该有一种方法可以
decltype
U
V
/Vector3D.cpp
:模板需要是(很少有特殊的例外)。@acocagua看起来
Vector3D.cpp
正在实现“显式实例化您需要的所有模板实例”的方法是从该问题的第一个答案开始的。@NathanPierson有一部分。但是没有显式实例化
操作符^
。可能首先要进行量纲化标量数学。例如,有一些库就是这样做的。构造函数如
矩(距离p_半径,力p_力)
在这种情况下不是很有用。顺便说一句,它叫做“动量”。嘿@Aconcagua当我实现你的方法时,一切都正常。但是我失去了做简单代码数学的能力,比如Vector3D=Vector3D^Vector3D,这是除了我提到的标称类型之外,我唯一需要支持的东西(力、力矩、距离等)链接器似乎总是选择运算符“^重载相关的decltype”,并抛出错误,即使我支持Vector3D运算符“^”(常量Vector3D&lhs,常量Vector3D&rhs)试图避免链接错误。您是否知道如何继续修复该差异。@hdamlaj编译器和准确的错误消息?GCC编译完全正常,请参见[此处](godbolt.org/z/WY669Y)。由于您在初始版本中已经有类型减法,我想您已经定义了自定义
运算符-
/// 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   Radius
Velocity(AngularVelocity p_omega, Distance p_radius);
//Vector3D.h
template <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>;