C++ 运算符和转换问题

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

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

错误结果:

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;

关于C++ 运算符和转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4350004/

相关文章:

c++ - 不定义函数的情况下如何运行此c++代码

c++ - 程序不进入__except block

c++ - CreateProcess 调用 cmd.exe 包括。没有显示(闪烁)窗口的参数?

C++ 修改基类的属性

c++ - unique_ptr::deleter_type::pointer 有什么用?

带有输出的 C++ mex 文件错误

c# - 如何在 int64 中适应结构?

c++ - 告诉编译器我希望变量始终存储在寄存器中的正确方法是什么?

c++ - 基于模板参数递归重载

c++ - 我应该使用什么来代替模板化枚举?