2010-12-03 18 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 

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

下記の完全なコード。私はあなたがclass Readingdoubleのインスタンス間の追加を実行しようとしている

#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

+0

ところで、関数呼び出し中にコピーされないようにするには、これらの関数が 'ベクトル'の代わりに 'const vector 'を受け入れるようにしたいでしょう。 – Kos

+0

@Kos: 'mean()'はおそらく 'const vector &'、yesを取るべきです。しかし、現在実装されているように、 'median()'は実際に値で引数を取り、他の誰のためにも驚きを作成することなくソートできるコピーを作成する必要があります。 – aschepler

答えて

1

を進めることができます前に、これらの2つのエラーに取り組む必要があります。

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

または適切なグローバル演算子+を(提供することで、オーバーロード):

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

2番目のエラーを使用すると、デフォルトの変換Readingからdoubleへのパスのいずれかを提供していないので、これは限り動作しません。上記のようにReading::operator double()で解くべきです。

0

読み込みオブジェクトを二重変数に集計しようとしています。タンは、[i]は、オブジェクトを読み取る戻ると、あなたがdoubleReadingオブジェクトを合計することはできませんしながら、

sum += temps[i]; 

和タイプは、異なる種類に属しているので、あなたがプラス演算子のオーバーロードを定義し、理解コンパイラを作る必要があり、二重ですどのようにこれが行われた

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

それとも、より良い(驚き最小の原則を経由して)、自分のクラスの使用方法を変更します。

+0

operator plusのオーバーロードは実際には最良の方法ではありません。なぜなら、マイナスや積み上げなどのオーバーロードが必要になるからです。コンパイラに「このオブジェクトから数値を作る方法」を変換演算子とすべての算術演算が魔法のように動作し始めます。しかし、それは明白ではありません "レコードの数値は何ですか(気温かもしれない、時間かもしれない)、それは明白で単純なフィールドを明示的に参照することをお勧めします。 – Kos

+0

私はそうは思わない。この場合、演算子のオーバーロードの代わりに、各データメンバーに対してgetter/setterを記述することができます。演算子のオーバーロードは、多くの理由から重要です。最も重要なのは、オペランドの種類に応じて演算子の意味を特化していると思います。例えば、2つの日付オブジェクトを合計することは、日付と整数を合計することと意味的に異なります。両方の状況で同じプラス演算子を使用すると、データメンバーを公開するか、ゲッター/セッター関数のさまざまな風味を使用するよりはるかに直感的でスケーラブルでエレガントです。 –

0

あなたは、オペレータが+ =クラス読書

4

読書のための変換演算子を定義するために不足しています:

// 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;