我已经实现了自己的 SI Unit 类。使用算术运算时,生成的 SI 单位可能会发生变化。例如:(米/秒)/米=1/秒。
好的,现在我还创建了一个简单的 3D Vector 类。这个向量应该是通用的,也可以用于我的 SI Unit 类。所以我实现了一个简单的除法运算符。请参阅以下代码:
// Determine result type of Lhs / Rhs:
template < class Lhs, class Rhs >
struct TV3TypeV3Div { typedef BOOST_TYPEOF( Lhs( ) / Rhs( ) ) type; };
// Vector / Vector:
template < class Lhs, class Rhs >
RobotTools::DataTypes::TV3Type< typename TV3TypeV3Div< Lhs, Rhs >::type > operator/( const RobotTools::DataTypes::TV3Type< Lhs >& lhs,
const RobotTools::DataTypes::TV3Type< Rhs >& rhs )
{
// do something useful
return RobotTools::DataTypes::TV3Type< typename TV3TypeV3Div< Lhs, Rhs >::type >( 0, 0, 0 );
}
// Vector / Vector
RobotTools::DataTypes::TV3Type< Tools::DataTypes::Length > vl;
vl / vl; // Ok this works
在编译期间,正确的返回类型将通过使用 TV3TypeV3Div 结构来确定。这行得通。
现在我想扩展运营商。我还想计算标量类型的向量。所以我写了这个运算符:
// Vector / Scalar
template < class Lhs, class Rhs >
RobotTools::DataTypes::TV3Type< typename TV3TypeV3Div< Lhs, Rhs >::type > operator/( const RobotTools::DataTypes::TV3Type< Lhs >& lhs,
const Rhs& rhs )
{
// do something useful
return RobotTools::DataTypes::TV3Type< typename TV3TypeV3Div< Lhs, Tools::DataTypes::Length >::type >( 0, 0, 0 );
}
// Vector / Scalar
RobotTools::DataTypes::TV3Type< Tools::DataTypes::Length > vl;
Tools::DataTypes::Length sl;
vl / sl; // Ok nice it works too
到现在为止还挺好。问题是当我定义第二个运算符(向量/标量)时,这个运算符非常通用,编译器也希望将它用于向量/向量除法。但它失败了,因为 Lhs( ) / Rhs( ) 有:
Lhs=Tools::DataTypes::Length 和 Rhs=RobotTools::DataTypes::TV3Type
没有定义。这是正确的,我理解给定的错误。我不明白的是编译器不使用 Vector/Vector 运算符。
- 有没有可能给编译器提示使用哪个运算符?
- 有没有可能重写运算符来满足我的要求?