【问题标题】:interesting issue operator overloading [duplicate]有趣的问题运算符重载[重复]
【发布时间】:2012-11-30 21:22:01
【问题描述】:

可能重复:
Operator overloading
What causes C++ compiler error: must have argument of class or enumerated type?

我正在尝试使用 C++ 中的运算符重载和泛型,我在尝试编译时似乎有 3 个小错误。使用模板 D 有一个名为 Grandeur 的类,然后我从这个类继承了 3 个类,分别命名为 Temps(time)Longueur(size)Vitesse(speed),并且我正在尝试重载运算符,例如当我执行 Temps+Temps->Temps, Vitesse+Vitesse=Vitesse,Longueur+Longueur->Longueur, Longueur/Time->Vitess 等时。 为了不为相同类型的操作编写 3 次相同的函数,我使用模板来利用通用性。但是当我尝试编译时出现错误。这是我的代码:

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 个函数(内联)的行。我能做什么?

【问题讨论】:

  • 您用作参数类型的类不存在于该范围内。
  • 好的,我现在明白了。但是因为我使用泛型,所以我不能明确地写出来。我能做什么?
  • 不知道怎么改。
  • 只需将class Vitesse : public Grandeur&lt;Vitesse&gt; { ... }class Longueur : public Grandeur&lt;Longueur&gt; { ... } 移出template&lt;typename D&gt; class Grandeur { ... }

标签: c++ overloading operator-keyword


【解决方案1】:

您在全局范围内声明运算符,因此编译器无法使用 Vitesse 等类型。为什么不将子类移到Grandeur&lt;T&gt; 的定义之外?

编辑评论: 您正在尝试使用具有双精度值的运算符,但隐式转换不会由您的子类自动继承。您需要在每个子模板中定义它们并将参数传递给父模板类。

【讨论】:

  • 如果我这样做,我会得到:grandeurs.h:35:26:错误:没有匹配函数调用“Longueur::Longueur(double)”grandeurs.h:35:26:注意:候选人是:grandeurs.h:57:9:注意:Longueur::Longueur() (const Longueur&) grandeurs.h:57:9: 注意:没有已知的参数 1 从 'double' 到 'const Longueur&' 的转换
猜你喜欢
  • 1970-01-01
  • 2010-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多