Проблемы с boost :: multi_index, неполным типом, отсутствием соответствующего вызова функции и т. Д. - PullRequest
0 голосов
/ 07 апреля 2020

Это с Boost 1.72.0. Что я делаю неправильно? Это простой пример, где я пытаюсь создать структуру с именем employee, которая может быть отсортирована как по id, так и по имени. Я хотел попробовать это, прежде чем интегрировать multi_index в более крупный и сложный проект, который требует гораздо больше индексов. Но я столкнулся с ошибками, используя код ниже. Я скомпилировал его, используя G CC 7.30. Поскольку сообщения об ошибках являются сложными и подробными, я их не включил.

Вот полный источник минимального примера:

#include <iostream>
#include <string>

#include <boost/multi_index_container.hpp>
#include <boost/multi_index/hashed_index.hpp>
#include <boost/multi_index/member.hpp>

using namespace boost::multi_index;

struct employee {
    employee(unsigned int id, std::string name)
        : id(id), name(name)
    {}

    unsigned int id;
    std::string name;

    bool operator<(const employee& other) const noexcept {
        return this->id < other.id;
    }
};

struct indexedById {};
struct indexedByName {};

using EmployeeContainer = boost::multi_index_container
<
    employee,
    indexed_by<
        ordered_unique<tag<indexedById>, identity<employee>>,
        hashed_non_unique<tag<indexedByName>, member<employee, std::string, &employee::name>>
    >
>;

int main()
{
    EmployeeContainer mi;
    auto& inserter = mi.get<indexedByName>();
    inserter.emplace(0, "uber duber");
    inserter.emplace(1,  "gotcha");
    inserter.emplace(3, "dang");

    for(auto& it : mi.get<indexedById>())
        std::cout << it.id << ": " << it.name << std::endl;

    std::cin.get();
    return 0;
}

1 Ответ

0 голосов
/ 07 апреля 2020

ОК, я исправил это. Мне нужно было включить заголовочные файлы и в дополнение к другим.

#include <iostream>
#include <string>

#include <boost/multi_index_container.hpp>
#include <boost/multi_index/key_extractors.hpp>
#include <boost/multi_index/hashed_index.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/member.hpp>

using namespace boost::multi_index;

struct employee {
    employee(unsigned int id, std::string name)
        : id(id), name(name)
    {}

    unsigned int id;
    std::string name;

    bool operator<(const employee& other) const noexcept {
        return this->id < other.id;
    }
};

struct indexedById {};
struct indexedByName {};

using EmployeeContainer = boost::multi_index_container
<
    employee,
    indexed_by<
        ordered_unique<tag<indexedById>, identity<employee>>,
        hashed_non_unique<tag<indexedByName>, member<employee, std::string, &employee::name>>
    >
>;

int main()
{
    EmployeeContainer mi;
    auto& inserter = mi.get<indexedByName>();
    inserter.emplace(0, "uber duber");
    inserter.emplace(1, "gotcha");
    inserter.emplace(3, "dang");

    for(auto& it : mi.get<indexedById>())
        std::cout << it.id << ": " << it.name << std::endl;

    std::cin.get();
    return 0;
}

Это вывод:

0: uber duber
1: gotcha
3: dang

Итак, мораль истории, добавить заголовочные файлы для каждого типа индекса вы делаете!

...