0

私は専門家ですが、オンラインで練習しているときに、別の問題に遭遇しました。これは関数テンプレートに関するものです。テンプレートを作成することはできますが、適切な演算子をオーバーロードする方法がわかりません。お知らせ下さい。

質問

同じパラメーター化された型の 3 つの要素のうち最大のものを返す関数テンプレートmaximumOfTree 。関数テンプレートはどのクラスに適用できますか? name,model,mass のフィールドを持つクラスtrainEngineを作成します。適切な演算子をオーバーロードして、largestOfThree関数テンプレートを 3 つのtrainEngineオブジェクトに適用できるようにします。

ここのところ ?

 template<class T>
 bool largestOfThree(T t1, T t2, T t3){
  if(t1<t2&&t2<t3){
  return true;
   }else{
    return false;
  }
 }

トレインエンジン

class trainEngine {
private:
string name;
string model;
string mass;
public:
friend bool operator<(trainEngine const& lhs) {
if (lhs.name<lhs.model&&lhs.model<lhs.mass){
return true;
}

};

4

3 に答える 3

3

Afriend operator<は非メンバーになるため、バイナリにする必要があります。さらに、戻り値の型を忘れました。あなたはおそらく望むでしょう:

friend bool operator<(trainEngine const& lhs, trainEngine const& rhs) {
    // implementation
}

これは、operator<宣言が現在ある場所に移動します。

これは、演算子のオーバーロードの慣用的なシグネチャのリストと、コメントで juanchopanza が言及した内容のより詳細な説明です非メンバ オペレータは、フレンドとしてマークされている場合、クラス本体内で定義できることに注意してください。(これを行う場合、それらはまだ非メンバー関数です。)

于 2012-12-02T11:26:05.080 に答える
0

現在、実装は右側(lhsと呼んでいます!)にのみ依存していることに注意してください。それは確かにあなたが望むものではありません。

私はあなたがこのようなものが欲しかったと思います:

bool operator<(trainEngine const& rhs) {
  if(name!=rhs.name) 
    return(name<rhs.name);
  if(model!=rhs.model)
    return (model<rhs.model);
  return (mass<rhs.mass);
}

または友達バージョン

//within the class
friend bool operator<(trainEngine const& lhs, trainEngine const& rhs);

//outside the class
bool operator<(trainEngine const& lhs, trainEngine const& rhs) {
  if(lhs.name!=rhs.name) 
    return(lhs.name<rhs.name);
  if(lhs.model!=rhs.model)
    return (lhs.model<rhs.model);
  return (lhs.mass<rhs.mass);
}
于 2012-12-02T14:38:58.113 に答える
0

演算子 ' ' をオーバーロードする場合は、演算子 ' '<もオーバーロードする必要があります>

また、戻り型 bool も記述する必要があります。

 friend bool operator<(trainEngine const& obj1, trainEngine const& obj2)

実際、ほとんどのコードでは、以上の使用を優先するのが慣例となっていますが<>より一般的には、関連する演算子の完全なセットを常にオーバーロードします。あなたの場合、これはおそらく==!=<=および>=です。

于 2012-12-02T11:27:17.137 に答える