2010-12-03 67 views
0
double mean(vector<Reading> temps) 
{ 
// stub version 
    double mean_temp; 
    double sum = 0; 
    for (int i = 0; i< temps.size(); ++i) sum += temps[i]; 
    mean_temp = sum/temps.size(); 
    return (mean_temp); 
} 

double median(vector<Reading> temps) 
{ 
// stub version 
    double median_temp; 
    sort (temps.begin(), temps.end()); 
    median_temp = temps[temps.size()/2]; 
    return (median_temp); 
} 

======================================= =====C++操作員和轉換問題

導致錯誤:

proj4.cc: In function ‘double mean(Vector<Reading>)’: 
proj4.cc:132: error: no match for ‘operator+=’ in ‘sum += temps.Vector<T>::operator[] [with T = Reading](((unsigned int)i))’ 
proj4.cc: In function ‘double median(Vector<Reading>)’: 
proj4.cc:142: error: cannot convert ‘Reading’ to ‘double’ in assignment 

============================== ===============

下面的完整代碼。我需要解決這兩個錯誤之前,我可以繼續

#include <bjarne/std_lib_facilities.h> 

struct Reading { 
    int hour; 
    double temperature; 
    Reading(int h, double t): hour(h), temperature(t) { } 
    bool operator<(const Reading &r) const; 
}; 

bool Reading::operator<(const Reading &r) const 
{ 
// stub version 

    vector<Reading> temps; 
    sort (temps.begin(), temps.end()); 

} 

/* 
* function declarations 
*/ 

ostream& operator<<(ostream& ost, const Reading &r); 

vector<Reading> get_temps(); 

double check_adjust_temp(double temperature, char scale); 

double c_to_f(double temperature); 

double mean(vector<Reading> temps); 

double median(vector<Reading> temps); 

void print_results(const vector<Reading>& temps, double mean_temp, 
      double median_temp); 

int main() 
    try 
    { 
     vector<Reading> temps = get_temps(); 
     if (temps.size() == 0) error("no temperatures given!"); 
     double mean_temp = mean(temps); 
     sort(temps.begin(), temps.end()); 
     double median_temp = median(temps); 
     print_results(temps, mean_temp, median_temp); 
    } 
    catch (exception& e) { 
    cerr << "error: " << e.what() << '\n'; 
    return 1; 
    } 
    catch (...) { 
    cerr << "Oops: unknown exception!\n"; 
    return 2; 
    } 

/* 
* function definitions 
*/ 

ostream& operator<<(ostream& ost, const Reading &r) 
{ 
// stub version 

/* 

*/ 
    return ost; 
} 

vector<Reading> get_temps() 
{ 
// stub version 
    cout << "Please enter name of input file name: "; 
    string name; 
    cin >> name; 
    ifstream ist(name.c_str()); 
    if(!ist) error("can't open input file ", name); 

    vector<Reading> temps; 
    int hour; 
    double temperature; 
    while (ist >> hour >> temperature){ 
    if (hour <0 || 23 <hour) error("hour out of range"); 
    temps.push_back(Reading(hour,temperature)); 
    } 

} 

double check_adjust_temp(double temperature, char scale) 
{ 
// stub version 

    if (scale== 'c' || 'C'){ 

    return c_to_f(temperature); 
    } 
    else if (scale== 'f' || 'F') { 

    return temperature; 
    } 
    else { 

    error("Wrong input type"); 
    } 
} 

double c_to_f(double temperature) 
{ 
// stub version 
    double c; 
    c = ((temperature * (9.0/5)) + 32); 
    return (c); 
} 

double mean(vector<Reading> temps) 
{ 
// stub version 
    double mean_temp; 
    double sum = 0; 
    for (int i = 0; i< temps.size(); ++i) sum += temps[i]; 
    mean_temp = sum/temps.size(); 
    return (mean_temp); 
} 

double median(vector<Reading> temps) 
{ 
// stub version 
    double median_temp; 
    sort (temps.begin(), temps.end()); 
    median_temp = temps[temps.size()/2]; 
    return (median_temp); 
} 

void print_results(const vector<Reading>& temps, double mean_temp, 
      double median_temp) 
{ 
// stub version 
    cout << "The sorted temperatures are:\n"; 
    cout << get_temps; 
    cout << "The mean temperature is " << mean_temp << ".\n"; 
    cout << "The median temperature is " << median_temp << ".\n"; 
} 
+0

歡迎來到PsychicsOverflow.com:什麼是「閱讀」,當它在家裏? – Roddy 2010-12-03 21:28:09

+0

BTW-你可能想讓這些函數接受一個`const vector &`而不是`vector `,以確保它們在函數調用期間不會被複制。 – Kos 2010-12-03 21:32:54

回答

1

你試圖執行一個class Readingdouble的實例之間的加成。這是你沒有提供無論是從Readingdouble默認的轉換路徑不只要工作:

Reading::operator double() const { return temperature; } 

,或者通過提供適當的全球運營商+()重載:

double operator+(Reading const&, double); 
double operator+(double, Reading const&); 

第二個錯誤應該可以通過Reading::operator double()解決,如上所示。

0

您正試圖總結將對象讀入雙變量!

sum += temps[i]; 

和類型是雙,而臨時工[I]返回閱讀對象,你不能總結doubleReading對象,因爲它們屬於不同的類型,你必須定義運營商的過載,使編譯理解這是如何完成的

0

你缺少運營商+ =爲類閱讀

4

定義用於讀取轉換操作符:

struct Reading { 
    int hour; 
    double temperature; 
    Reading(int h, double t): hour(h), temperature(t) { } 
    bool operator<(const Reading &r) const; 
    operator double() { return temperature; } 
}; 

或者,更好的(通過最小驚訝原則),只是改變你的類的用法:

// was: 
sum += temps[i]; 
//change to: 
sum += temps[i].temperature; 

// was: 
median_temp = temps[temps.size()/2]; 
//change to: 
median_temp = temps[temps.size()/2].temperature;