2010-12-03 66 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;