Поиск boost::bimap для текущего экземпляра класса

Итак, я объявил boost::bimap так:

boost::bimap<object*, position> object_list;

Где объект и позиция — это класс и структура соответственно.

В текущем объекте, хранящемся в бимапе, я хочу найти его собственную запись.

В настоящее время я пытаюсь сделать это следующим образом:

void order::do_thing() {
    ...
    position pos = object_list.left.at(this);
    ...
}

У меня проблемы с анализом вывода ошибки, но похоже, что функция at бимапа не любит константность и/или ссылочность этого (и да, я знаю, что это rvalue).

Каким будет правильный/предлагаемый способ выполнения этого поиска?

Вот фрагмент ошибки:

order.cpp:117:56:   required from here
/usr/include/boost/bimap/container_adaptor/associative_container_adaptor.hpp:207:56: error: no match for call to ‘(const boost::bimaps::container_adaptor::detail::key_to_base_identity<object*, object* const>) (order* const&)’
                 this->template functor<key_to_base>()(k)

(Правка добавлена, чтобы ответить на комментарии sehe и указать на проблему)

Извиняюсь, если мой пост был в плохом этикете, я новичок в публикации на SO, и я предполагал, что просто сброс всего моего кода (только для включения пользовательских объектов и шаблонов для этого раздела кода сотни строк) считать дурным тоном, поэтому я урезал его до (как мне казалось) самого минимума, чтобы по-прежнему иметь дело с проблемой.

И просто для ссылки на тест-кейсы я пишу тест-кейсы. В этом случае я заменял вектор на бимап для добавления в код позиции, и это на самом деле не компилируется (хотя я скажу, что я не очень четко указал, что это ошибка компиляции, а не трассировка стека). Я предполагаю, что вы (sehe) думали, что я говорю об ошибке времени выполнения, потому что в противном случае я не понимаю, насколько релевантна ссылка.

В любом случае, я обрезал код до фактического минимума, чтобы воспроизвести ошибку, чтобы я мог опубликовать ее здесь, а затем понял реальную проблему. Как показано выше, бимап содержит значения <object*, position> Но класс, пытающийся вставить себя в бимап, является классом order: voidorder ::do_thing() {

Так что это оказалось простой ошибкой типа. Извините, все, за действительно глупый вопрос. Наверное, это то, что я получаю за работу над проектами в 3 часа ночи.


person Melasoul    schedule 18.10.2015    source источник
comment
Вы должны показать свой фактический код. Потратив время, я смог /угадать/ вашу вероятную проблему, но если бы вы включили SSCCE и фактические сообщения компилятора, вы бы сэкономили себе (и другим) много времени.   -  person sehe    schedule 18.10.2015


Ответы (1)


Нет проблем.

Единственная ошибка, о которой я могу думать, это то, что у вас есть this неявно const. В этом случае карта должна будет использовать указатели на const object!

См. этот образец здесь. Раскомментируйте // const, чтобы увидеть вариант с const:

Жить на Coliru (не -const)

Жить на Coliru (const )

#include <boost/bimap.hpp>
#include <iostream>

using position = std::string;

#define USE_CONST // const

struct object {
    template <typename BiMap>
    position get_position(BiMap const& bimap) USE_CONST {
        return bimap.left.at(this);
    }
};

int main() {
    std::vector<object> instances(10);

    boost::bimap<object USE_CONST*, position> mapping;

    for (auto& instance : instances)
        mapping.insert({&instance, "instance #" + std::to_string(mapping.size()+1)});

    for (auto& instance : instances)
        std::cout << "Instance reports " << instance.get_position(mapping) << "\n";
}

Отпечатки

Instance reports instance #1
Instance reports instance #2
Instance reports instance #3
Instance reports instance #4
Instance reports instance #5
Instance reports instance #6
Instance reports instance #7
Instance reports instance #8
Instance reports instance #9
Instance reports instance #10
person sehe    schedule 18.10.2015
comment
Технически проблема не в этом, и я думаю, что ваши ссылки были немного чрезмерными, но объединение кода для публикации здесь привело меня к тому, что я увидел проблему, поэтому я отдаю вам должное за ответ. - person Melasoul; 19.10.2015