2015-01-07 4 views
9

Ich habe die folgende Quelle aus dem Text Accelerated C++. Wenn ich versuche, die Quelldatei zu kompilieren, erhalte ich den folgenden Kompilierungsfehler, der unten aufgeführt ist. Ich bin ein Neuling der C++ Sprache, also würde Ihre Unterstützung geschätzt werden.Bindung der Referenz auf einen Wert von Typ Tropfen Qualifier

#include <algorithm> 
#include <iomanip> 
#include <ios> 
#include <iostream> 
#include <string> 
#include <vector> 
#include <stdexcept> 

using namespace std; 

struct Student_info { 
    string name; 
    double midterm, final; 
    vector<double> homework; 
}; 

double median(vector<double>); 
double grade(const Student_info&); 
double grade(double, double, double); 
double grade(double, double, const vector<double>&); 
istream& read_hw(istream&, vector<double>&); 
istream& read(istream&, Student_info&); 
bool compare(const Student_info&, Student_info&); 

int main() { 

    vector<Student_info> students; 
    Student_info record; 
    string::size_type maxlen = 0; 

    while(read(cin, record)) { 
     maxlen = max(maxlen, record.name.size()); 
     students.push_back(record); 
    } 

    sort(students.begin(), students.end(), compare); 

    for(vector<Student_info>::size_type i = 0; 
      i != students.size(); ++i) { 

     cout << students[i].name << string(maxlen + 1 - students[i].name.size(), ' '); 

     try { 
      double final_grade = grade(students[i]); 
      streamsize prec = cout.precision(); 
      cout << setprecision(3) << final_grade 
        << setprecision(prec); 
     } catch(domain_error& e) { 
      cout << e.what(); 
     } 
     cout << endl; 
    } 
    return 0; 
} 

double median(vector<double> vec) { 
    typedef vector<double>::size_type vec_sz; 
    vec_sz size = vec.size(); 

    if(size == 0) 
     throw domain_error("median of an empty vector"); 

    sort(vec.begin(), vec.end()); 
    vec_sz mid = size/2; 

    return size%2 == 0 ? (vec[mid] + vec[mid - 1])/2 : vec[mid]; 
} 
double grade(const Student_info& s) { 
    return grade(s.midterm, s.final, s.homework); 
} 
double grade(double midterm, double final, double homework) { 
    return 0.2*midterm + 0.4*final + 0.4*homework; 
} 
double grade(double midterm, double final, const vector<double>& hw) { 
    if(hw.size() == 0) 
     throw domain_error("student has done no homework"); 
    return grade(midterm, final, median(hw)); 
} 
istream& read_hw(istream& in, vector<double>& hw) { 
    if(in) { 
     hw.clear(); 

     double x; 
     while(in >> x) 
      hw.push_back(x); 
     in.clear(); 
    } 

    return in; 
} 
istream& read(istream& is, Student_info& s) { 
    is >> s.name >> s.midterm >> s.final; 
    read_hw(is, s.homework); 
    return is; 
} 
bool compare(const Student_info& x, const Student_info& y) { 
    return x.name < y.name; 
} 

Bezugs binding 'Student_info' auf einen Wert des Typs 'const Student_info' fällt Qualifier compute_grades_rev-b
Leitung 125, externen Ort eingeben: /usr/include/c++/4.2.1/bits/ stl_algo.h C/C++ Problem

Hier ist der Code von stl_algo.h:

template<typename _Tp, typename _Compare> 
    inline const _Tp& 
    __median(const _Tp& __a, const _Tp& __b, const _Tp& __c, _Compare __comp) 
    { 
     // concept requirements 
     __glibcxx_function_requires(_BinaryFunctionConcept<_Compare,bool,_Tp,_Tp>) 
     if (__comp(__a, __b)) 
    if (__comp(__b, __c)) 
     return __b; 
    else if (__comp(__a, __c)) 
     return __c; 
    else 
     return __a; 
     else if (__comp(__a, __c)) 
    return __a; 
     else if (__comp(__b, __c)) 
    return __c; 
     else 
    return __b; 
    } 

ich die Erklärung der Vergleichsfunktion ändern von:

bool compare(const Student_info&, Student_info&); 
bool compare(const Student_info, Student_info); 

Jetzt kompiliert es.

+0

Welche Linie 125 ist? – user3553031

+0

@ user3553031 if (__comp (__ a, __b)) – dcrearer

Antwort

16

Der Fehler zeigt an, dass Sie nicht eine nicht konstante Referenz auf ein const-Objekt binden kann, als dass fallen (Verwerfungs in anderen Compiler-Fehler) würde, außer Acht lassen oder ignorieren die const Qualifier.

Es gibt an, dass wenn die Operation erlaubt war, Sie in der Lage wären, das Objekt über die Referenz zu ändern, ohne die Tatsache zu beachten, dass das Objekt selbst const ist, was const-correctity bricht.

in Ihrer speziellen Code, die Funktion __median in der Bibliothek nimmt __a, __b und __c durch const Referenz und versucht, den __comp Funktion aufrufen, die im Programm (erste Erklärung), um das zweite Argument durch nicht konstante Referenz . Um __comp(__a,__b) (oder einen anderen Aufruf an __comp in dieser Funktion) aufrufen zu können, müsste ein Objekt, das nur über eine const& zugänglich ist, an das zweite Argument gebunden werden, das eine nicht-konstante Referenz verwendet. Dies ist höchstwahrscheinlich ein Tippfehler, da Sie unten compare definieren, wobei beide Argumente Const-Referenzen sind.

Ändern Sie die Deklaration von compare vor Haupt zu:

bool compare(const Student_info&, const Student_info&); 
//        ^^^^^ 
+0

können Sie Ihre Position mit einem Schnipsel des korrigierten Codes aus meiner Probe bitte erklären – dcrearer

+0

genial danke ... – dcrearer

Verwandte Themen