2015-01-07 15 views
9

Ho la seguente origine da Text ++ C++ accelerato. Quando tento di compilare il file sorgente ottengo il seguente errore di compilazione elencato di seguito. Sono un neofita del linguaggio C++ quindi la tua assistenza sarà apprezzata.associazione di riferimento a un valore di tipo drops qualificatori

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

legame di riferimento di tipo 'Student_info' ad un valore di tipo 'const Student_info' gocce qualificatori compute_grades_rev-b
linea 125, posizione esterna: /usr/include/c++/4.2.1/bits/ stl_algo.h C/C++ Problema

Ecco il codice da 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; 
    } 

cambio la dichiarazione della funzione di confronto da:

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

Ora compila.

+0

Quale è la linea 125? – user3553031

+0

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

risposta

16

L'errore indica che non è possibile associare un riferimento non const a const oggetto, in quanto ciò goccia (scarto errori di altro compilatore), violazione o ignorare la qualificazione const.

Ciò che tenta di indicare è che se l'operazione è stata consentita, sarebbe possibile modificare l'oggetto tramite il riferimento ignorando il fatto che l'oggetto stesso è const, che interrompe la correttezza della const.

Nel codice particolare, la funzione __median nella libreria prende __a, __b, e __c per riferimento const e cerca di chiamare la funzione __comp, che nel vostro programma (prima dichiarazione) batte il secondo argomento con riferimento non-const . Per poter chiamare __comp(__a,__b) (o qualsiasi altra chiamata a __comp in quella funzione), è necessario associare un oggetto accessibile solo tramite un const& al secondo argomento che accetta un riferimento non const. Probabilmente si tratta di un refuso, dal momento che si definisce compare di seguito con entrambi gli argomenti come riferimenti const.

Modificare la dichiarazione di compare prima principale per:

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

puoi spiegare la tua posizione con uno snippet del codice corretto dal mio esempio per favore – dcrearer

+0

impressionante grazie ... – dcrearer

Problemi correlati