Хорошо, я добавил boost :: bimap так:
boost::bimap<object*, position> object_list;
Где объект и позиция — это класс и структура соответственно.
В текущем объекте, сохраненном в bimap, я хочу найти свою собственную запись.
В настоящее время я пытаюсь сделать это так:
void order::do_thing() {
...
position pos = object_list.left.at(this);
...
}
У меня проблемы с анализом вывода ошибок, но кажется, что функция at bimap не любит постоянство и / или эталонность этого (и да, я знаю, что это r-значение).
Каков будет правильный / предложенный способ сделать этот поиск?
Вот фрагмент ошибки:
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) думали, что я говорил об ошибке во время выполнения, потому что в противном случае я не вижу, насколько релевантна ссылка.
Так или иначе, я урезал код до фактического минимума, чтобы воспроизвести ошибку, чтобы я мог опубликовать ее здесь, а затем понял реальную проблему. Как показано выше, bimap содержит значения <
объект *, position>
Но класс, пытающийся вставить себя в бимап, порядок учебный класс: void
порядок::do_thing() {
Так что это оказалось простой ошибкой типа. Извините, все, что задали действительно тупой вопрос. Я думаю, это то, что я получаю за работу над проектами в 3 часа ночи.
Нет проблем.
Единственная ловушка, о которой я могу думать, это то, что у вас есть this
неявно const. В этом случае карта должна будет указывать на const object
вместо!
Смотрите этот образец здесь. Раскоментируйте // const
чтобы увидеть вариацию с const:
Жить на Колиру (Неконстантный)
Жить на Колиру (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
Других решений пока нет …