2015-12-14 158 views
-2

這在Visual Studio 2015中運行良好,但在使用MinGw時無法正常運行。爲什麼?如何解決它?代碼有什麼問題?

錯誤信息:

敵不過 '運算< <'(操作數的類型是 '的std :: ostream的{又名的std :: basic_ostream}' 和 '分數')werjiorqq.cpp/werjiorqq/SRC線106 C/C++問題

敵不過 '運算< <'(操作數的類型是 '的std :: ostream的{又名的std :: basic_ostream}' 和 '分數')werjiorqq.cpp/werjiorqq/SRC線107c中/ C++問題

'operator'不匹配<'(操作數的類型是 '的std :: ostream的{又名的std :: basic_ostream}' 和 '分數')werjiorqq.cpp/werjiorqq/SRC線108 C/C++問題

敵不過 '運算< <' (操作數類型是'std :: ostream {aka std :: basic_ostream}和'Fraction')werjiorqq.cpp/werjiorqq/src line 109 C/C++問題

沒有匹配函數調用'Fraction :: Fraction分數)」 werjiorqq.cpp/werjiorqq/SRC線71 C/C++問題

爲調用沒有匹配的函數 '分數::分數(分數)' werjiorqq.cpp/werjiorqq/SRC線88 C/C++問題


#include <iostream>  
#include <cmath> 

using namespace std; 
int gcd(int m, int n) { 

    if (m%n == 0) 
     return n; 
    else 
     return gcd(n, m%n); 
} 

int preGcd(int m, int n) { 

    int absm = abs(m); 
    int absn = abs(n); 

    int g = gcd(absm, absn); 
    return g; 

} 


class Fraction { 
    int m, n; 
public: 
    Fraction() { 
    } 
    Fraction(Fraction& f) { 
     m = f.getM(); 
     n = f.getN(); 
    } 
    Fraction(int m, int n) { 
     this->m = m; 
     this->n = n; 
    } 

    friend ostream& operator<< (ostream& out,Fraction& f) { 
     cout << f.m << '/' << f.n << endl; 
     return out; 
    } 

    int getM() { 
     return m; 
    } 
    int getN() { 
     return n; 
    } 

    void reduction() { 
     int g; 
     if (n > m) 
      g = preGcd(n, m); 
     else 
      g = preGcd(m, n); 
     m /= g; 
     n /= g; 
    } 

    friend Fraction operator+ (Fraction f1,Fraction f2) { 
     int nn = f1.n*f2.n; 
     int nm = f1.m*f2.n + f2.m*f1.n; 
     Fraction *p = new Fraction(nm, nn); 
     p->reduction(); 
     return *p; 
      } 
    friend Fraction operator- (Fraction f1, Fraction f2) { 
     f2.m = (-f2.m); 
     return operator+ (f1, f2); 
    } 
    friend Fraction operator* (Fraction f1, Fraction f2) { 
     /*cout << f1; 
     cout << f2;*/ 
     int nn = f1.n*f2.n; 
     int nm = f1.m*f2.m; 
     Fraction *p = new Fraction(nm, nn); 
     p->reduction(); 
     return *p; 
    } 

    friend Fraction operator/ (Fraction f1, Fraction f2) { 
     int temp = f2.m; 
     f2.m = f2.n; 
     f2.n = temp; 

     return operator*(f1, f2); 
    } 

    void revenue() { 
     cout << n << '/' << m << endl; 
    } 

}; 



int main() { 
    int a, b, c, d; 
    cin >> a >> b >> c >> d; 

    Fraction f1(a, b); 
    Fraction f2(c, d); 

    cout << f1 + f2; 
    cout << f1 - f2; 
    cout << f1*f2; 
    cout << f1/f2; 
    f1.revenue(); 
} 
+0

這是個錯誤VS。在'operator <<'的定義中將'Fraction&'更改爲'const Fraction&'。 –

+2

這不是一個錯誤。這是一個編譯器擴展。如果你想讓編譯器報告錯誤,你可以傳遞'/ we4239'來專門禁用該擴展。或者你可以傳遞'/ Za'來禁用所有擴展。 –

回答

1

您需要申請const在可能的情況。例如:

Fraction(const Fraction &); 
friend ostream& operator<< (ostream& out, const Fraction& f); 
int getM() const; 
int getN() const;