1

重複の可能性:
演算子のオーバーロード
C++ コンパイラ エラーの原因: クラスまたは列挙型の引数が必要ですか?

C++ で演算子のオーバーロードと汎用性を少し試してみましたが、コンパイルしようとすると 3 つの小さなエラーが発生するようです。テンプレート D を使用して Grandeur という名前のクラスを作成し、このクラスから 、 、 という名前の 3 つのクラスを継承しTemps(time)Longueur(size)いつVitesse(speed)実行するかなどの演算子をオーバーロードしようとしていますTemps+Temps->Temps, Vitesse+Vitesse=Vitesse,Longueur+Longueur->Longueur, Longueur/Time->Vitess。同じタイプの操作の場合、テンプレートを使用して汎用性を利用します。しかし、コンパイルしようとするとエラーが発生します。これが私のコードです:

typedef double Longueur;
typedef double Temps;
typedef double Vitesse;



template<typename D>
class Grandeur {
  protected :
    double val; const char* unite;



  public :
    Grandeur(double qqc) : val(qqc) {}
    Grandeur(int qqc) : val(qqc) {}
    Grandeur(long qqc) : val(qqc) {}
    Grandeur(float qqc) : val(qqc) {}

    inline friend D operator+ (const D a, const D b) {
      return D (a.val + b.val);
    }

    inline friend D operator- (const D a, const D b) {
      return D (a.val - b.val);
    }

    inline friend double operator* (const D a, const D b) {
      return a.val * b.val;
    }

    inline friend double operator/ (const D a, const D b) {
      return a.val / b.val;
    }

    inline friend D operator* (D a, const int b) {
      return D (a.val * b);
    }

    inline friend D operator/ (const D a, const int b) {
      return D (a.val / b);
    }

    inline friend ostream& operator<< (ostream& os, D d) {
      return os << d.val << d.u;
    }

    class Temps : public Grandeur<Temps> {
    public:


  };

  class Vitesse : public Grandeur<Vitesse> {
    public:


  };

  class Longueur : public Grandeur<Longueur> {
    public:

  };

};




inline Longueur operator* (const Vitesse v, const Temps t) {
  return Longueur(v.val * t.val);
}

inline Vitesse operator/ (const Longueur l, const Temps t) {
  return Vitesse(l.val / t.val);
}

inline Temps operator/ (const Longueur l, const Vitesse v) {
  return Temps(l.val / v.val);
}

コンパイルしようとすると、次のように表示されます。

g++ essai.cc
In file included from essai.cc:4:0:
grandeurs.h:70:58: error: ‘Longueur operator*(Vitesse, Temps)’ must have an argument of class or enumerated type
grandeurs.h:74:58: error: ‘Vitesse operator/(Longueur, Temps)’ must have an argument of class or enumerated type
grandeurs.h:78:58: error: ‘Temps operator/(Longueur, Vitesse)’ must have an argument of class or enumerated type

行 70、74、および 78 は、最後の 3 つの関数 (インライン) を含む行です。私に何ができる?

4

1 に答える 1

1

グローバル スコープで演算子を宣言しているため、型Vitesseなどはコンパイラで使用できません。Grandeur<T>子クラスをの定義の外に移動しないのはなぜですか?

コメントの編集: double 値で演算子を使用しようとしていますが、暗黙的な変換は子クラスによって自動的に継承されません。各子でそれらを定義し、パラメーターを親テンプレート クラスに渡す必要があります。

于 2012-11-30T21:35:01.097 に答える