2016-03-30 8 views
2

私はstackoverflowを見渡し、うまくいけばソートで動作させるためにオーバーロード演算子を追加しました。私はまだ並べ替えで何かが間違っていると言っている間違いの爆発を得る。カスタムクラスを使用してstd :: sortエラー

コード:

#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

83行目に 'return 0'の後にセミコロンがあるはずです。 – v7d8dpo4

答えて

2

メンバ変数const int num_courses_;はconstです。つまり、コンストラクタの初期化子リストに設定する必要があります。

num_courses_は、コピー代入演算子Student& Student::operator=(Student&&)によって設定できないため、コンパイラがそのクラスのコピー代入演算子を生成できなくなります。使用可能なコピー代入演算子がなく、std :: sort関数が動作する必要があるため、コンパイルは失敗し、コピー代入演算子が利用できないと不平を言う。

constを削除し、変数をint num_courses_と宣言するだけでコードが機能するはずです。

関連する問題