2012-11-30 51 views
1

Possible Duplicate:
Operator overloading
What causes C++ compiler error: must have argument of class or enumerated type?有趣的問題運算符重載

我試圖發揮在C++運算符重載和泛型一點點,我似乎有3個個小錯誤,當我嘗試編譯。有一個名爲Grandeur的模板D,然後我從這個繼承了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個職能(內聯)。我能做什麼?

+1

您用作參數類型的類在該範圍中不存在。 – chris

+0

好的,我現在明白了。但是由於我使用通用性,我不能明確地寫出它。我能做什麼? –

+0

我不知道如何改變這一點。 –

回答

1

您正在聲明全局作用域的運算符,因此類型Vitesse等對編譯器不可用。爲什麼不在Grandeur<T>的定義之外移動子類?

編輯註釋: 您試圖使用具有double值的運算符,但隱式轉換爲而不是,您的子類會自動繼承。您需要在每個孩子中定義它們,並將參數傳遞給父級模板類。

+0

如果我這樣做,我得到:grandeurs.h:35:26:錯誤:沒有匹配函數調用'Longueur :: Longueur(double)' grandeurs.h:35:26:注意:候選人是: grandeurs。 h:57:9:note:Longueur :: Longueur() grandeurs.h:57:9:note:candidate expect 0 arguments,1 provided grandeurs.h:57:9:note:Longueur :: Longueur(const Longueur& ) grandeurs.h:57:9:注意:從'double'到'const Longueur&'的參數1沒有已知的轉換。 –