独自のSI単位系を実装しました。算術演算を使用すると、結果のSI単位が変わる可能性があります。例:(メートル/秒)/メートル=1/秒。
これで、単純な3DVectorクラスも作成しました。このベクトルは一般的であり、私のSI単位系でも使用できます。そこで、単純な除算演算子を実装しました。次のコードを参照してください。
// 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
ここまでは順調ですね。問題は、2番目の演算子(ベクトル/スカラー)を定義するときに、この演算子が非常に一般的であるため、コンパイラーがベクトル/ベクトル除算にも使用したいということです。しかし、Lhs()/ Rhs()が次のようになっているため、失敗します。
Lhs = Tools :: DataTypes::LengthおよびRhs=RobotTools :: DataTypes :: TV3Type
定義されてない。これは正しく、与えられたエラーを理解しています。私が理解していないのは、コンパイラがVector/Vector演算子を使用しないということです。
- どの演算子を使用するかについてコンパイラーにヒントを与える可能性はありますか?
- 要件を満たすために演算子を書き直す可能性はありますか?