Почему при использовании алгоритма копирования STL появляется "передача 'const Person', поскольку аргумент 'this' отбрасывает квалификаторы"? - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь реализовать максимальную кучу для определяемых пользователем структур, и я использую алгоритм std::copy_n() для ввода данных из файла heap.in, но я получаю от компилятора такую ​​ошибку:

передача 'const Person' в качестве аргумента 'this' отбрасывает квалификаторы

Кто-нибудь может сказать мне, в чем проблема?

#include <fstream>
#include <vector>
#include <queue>
#include <utility>
#include <algorithm>
#include <functional>
#include <iterator>
#include <string>
#include <iostream>


std::ifstream fin ("heap.in");
std::ofstream fout ("heap.out");

struct Person {
    int age;
    std::string name;

    bool operator < (const Person p) const{
        if (this->age != p.age)
            return this->age < p.age;
        return this->name < p.name;
    }

    friend std::istream& operator >> (std::istream& flux, Person& p) {
        flux >> p.name >> p.age;
        return flux;
    }

    friend std::ostream& operator << (std::ostream& flux, Person p) {
        flux << "(" << p.name << ", " << p.age << "); ";
        return flux;
    }

    friend std::ifstream& operator >> (std::ifstream& flux, Person& p) {
        flux >> p.name >> p.age;
        return flux;
    }

    friend std::ofstream& operator << (std::ofstream& flux, Person p) {
        flux << "(" << p.name << ", " << p.age << "); ";
        return flux;
    }
};

int n;
std::vector <Person> Heap;

int main () {
    fin >> n; 
    std::copy_n (Heap.begin (), n, std::istream_iterator <Person> (fin));
    return 0;
}

1 Ответ

2 голосов
/ 07 мая 2020

Думаю, вы имели в виду, что

int main () {
    fin >> n;
    std::copy_n (std::istream_iterator <Person> (fin), n, std::back_inserter(Heap));
    return 0;
}

std::copy_n копирует n элементов из первого аргумента в третий. Если вы хотите добавить к вектору, вы должны использовать обертку std::back_inserter, поскольку std::copy_n не увеличивает размер вектора сам по себе.

...