2016-03-30 5 views
2

Я просмотрел stackoverflow и добавил оператора перегрузки, чтобы, надеюсь, заставить его работать с сортировкой. Хотя я все еще получаю взрыв ошибки, говоря, что что-то не так сорт.std :: ошибка сортировки с использованием пользовательских классов

Код:

#include <iostream> 
#include <vector> 
#include <ctime> 
#include <cstdlib> 
#include <algorithm> 

class Student 
{ 
private: 
    std::string name_; 
    int number_; 
    std::vector<int> grades_; 
    const int num_courses_; 

    static std::string gen_name() { 
    return std::to_string(rand()); 
    } 
    static int gen_number() { 
    return rand() % (201600000 - 201100000 + 1) + 201100000; 
    } 
    static int gen_grade() { 
    return rand() % (100 - 70 + 1) + 70; 
    } 
    double compute_average() { 
    int marks = 0; 
    int count = 0; 
    for (std::vector<int>::iterator i = grades_.begin(); i != grades_.end(); i++, count++){ 
     marks += *i; 
    } 
    return static_cast<double>(marks)/count; 
    } 

public: 
    Student() : name_(gen_name()), number_(gen_number()), num_courses_(5) 
    { 
    for (int i = 0; i < num_courses_; ++i) { 
     grades_.push_back(gen_grade()); 
    } 
    } 

    double getAvg() { 
    return compute_average(); 
    } 
    friend std::ostream& operator<<(std::ostream& os, Student& s) { 
    os << "Name = " << s.name_ << "\tNumber = " << s.number_ << "\tAvg = " << s.compute_average(); 
    return os; 
    } 

    std::string getName() { 
    return name_; 
    } 
    void print_grades(std::ostream& os) const 
    { 
    for (int i = 0; i < num_courses_; ++i) { 
     os << grades_[i] << ", "; 
    } 
    } 
    bool operator < (const Student& str) const 
    { 
    return (name_ < str.name_); 
    } 
}; 


int main(int argc, char ** argv) { 
    srand(time(NULL)); 
    if (argc == 2){ 
    int numbOfStudents = atoi(argv[1]); 
    std::vector<Student> studentVec; 
    for (int i = 0; i < numbOfStudents; i++){ 
     studentVec.push_back(Student()); 
    } 

    std::sort(studentVec.begin(), studentVec.end()); 
    for (std::vector<Student>::iterator xi = studentVec.begin(); xi != studentVec.end(); xi++) { 
     std::cout << *xi << std::endl; 
    } 

    } 
    else{ 
    std::cout << "Usage: " << argv[0] << " {numb} " << std::endl; 
    } 
    return 0 
} 

Ошибка возникает, когда я бегу рода (я знаю, что это своего рода, так как если я комментирую его, он работает должным образом). С кодом ошибки

In file included from /usr/include/c++/4.9/algorithm:62:0, 
      from main.cpp:5: 
/usr/include/c++/4.9/bits/stl_algo.h: In instantiation of ‘void std::__insertion_sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Student*, std::vector<Student> >; _Compare = __gnu_cxx::__ops::_Iter_less_iter]’: 
/usr/include/c++/4.9/bits/stl_algo.h:1884:70: required from ‘void std::__final_insertion_sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Student*, std::vector<Student> >; _Compare = __gnu_cxx::__ops::_Iter_less_iter]’ 
/usr/include/c++/4.9/bits/stl_algo.h:1970:55: required from ‘void std::__sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Student*, std::vector<Student> >; _Compare = __gnu_cxx::__ops::_Iter_less_iter]’ 
/usr/include/c++/4.9/bits/stl_algo.h:4685:72: required from ‘void std::sort(_RAIter, _RAIter) [with _RAIter = __gnu_cxx::__normal_iterator<Student*, std::vector<Student> >]’ 
main.cpp:79:50: required from here 
/usr/include/c++/4.9/bits/stl_algo.h:1851:17: error: use of deleted function ‘Student& Student::operator=(Student&&)’ 
    *__first = _GLIBCXX_MOVE(__val); 

Я искал раньше, который помог мне получить к результату добавления «<» перегрузки, хотя я все еще получаю ошибку. Может ли кто-нибудь указать, где ошибка? Спасибо. (Я компилирую с помощью g ++ --std = C++ 11)

+2

В двух словах: 'num_courses_' const, поэтому' sort' не может его изменить. – immibis

+0

Святое, это было так просто. Огромное спасибо. Теперь я чувствую себя таким глупым ... – Nom

+0

Должна быть точка с запятой после 'return 0' в строке 83. – v7d8dpo4

ответ

2

переменная-член const int num_courses_; является константой, что означает, что она должна быть установлена ​​в списке инициализаторов конструктора.

num_courses_ не может быть задан оператором присваивания копий Student& Student::operator=(Student&&), поэтому он не позволяет компилятору генерировать оператор присваивания копии для этого класса. Поскольку нет оператора присваивания копиям, и функция std :: sort нуждается в его работе, компиляция завершается с ошибкой и жалуется на то, что оператор назначения копирования не доступен.

Просто удалите const и объявите переменную как int num_courses_, и ваш код должен работать.