簡體   English   中英

C ++運算符和轉換問題

[英]C++ Operator and Conversion Issues

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);
}

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

導致錯誤:

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";
}

為閱讀定義轉換運算符:

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;

您正在嘗試在class Reading的實例和double的實例之間執行加法double 只要您沒有提供從Readingdouble的默認轉換路徑,這就不會起作用:

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

或通過提供適當的全局operator +()重載:

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

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

您正在嘗試總結將對象讀入雙精度變量!

sum += temps[i];

sum類型為double,而temps [i]返回Reading對象,您不能對doubleReading對象求和,因為它們屬於不同類型,因此必須定義plus運算符的重載,並使編譯器了解如何完成此操作

您在閱讀類中缺少operator + =

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM