binding af henvisning til en værdi af type dråber-kvalifikation

Jeg har følgende kilde fra Teksten Accelerated C++. Når jeg forsøger at kompilerer kilde-fil, får jeg følgende samling fejl, der er anført nedenfor. Jeg er en novice af C++ – sproget, så din hjælp vil blive værdsat.

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

bindende reference til type ‘Student_info’ til en værdi af typen “const Student_info’ dråber kvalifikationskampe compute_grades_rev-b

line 125, ekstern placering: /usr/include/c++/4.2.1/bits/stl_algo.h C/C++ Problem

Her er koden fra 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;
    }

Jeg ændrer angivelsen af compare-funktionen fra:

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

Nu det samler.

Der er line 125?
hvis (__comp(__a __b))

OriginalForfatteren dcrearer | 2015-01-07

1 svar

  1. 24

    Fejlen er, og angiver, at du ikke kan binde en ikke-const henvisning til en const-objekt, som der ville drop (kassere i andre compiler fejl), se bort fra eller ignorerer const kvalifikationskamp.

    Det, som det forsøger at vise er, at hvis operationen var tilladt, ville du være i stand til at ændre objektet gennem reference ignorerer det faktum, at genstanden i sig selv er const, bryde const-korrekthed.

    I netop din kode, funktion __median i biblioteket tager __a, __b, og __c af const reference og forsøger at ringe op til __comp funktion, som i dit program (første erklæring) tager det andet argument med ikke-const reference. At være i stand til at kalde __comp(__a,__b) (eller enhver anden opfordring til __comp i, at funktion) det ville være at binde et objekt, er kun tilgængelige gennem en const& til det andet argument, der tager en ikke-const reference. Dette er sandsynligvis en slåfejl, da du definerer compare nedenfor med begge argumenter er const referencer.

    Ændre angivelsen af compare før main til:

    bool compare(const Student_info&, const Student_info&);
    //                               ^^^^^
    kan du forklare din position med et uddrag af den korrigerede kode fra min prøve venligst
    awesome tak…

    OriginalForfatteren David Rodríguez – dribeas

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *