2015-10-18 3 views
1

Ok, так что я подталкивание :: bimap объявлен так:Поиск подталкивание :: bimap для текущего экземпляра класса

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

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

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

В настоящее время я пытаюсь сделать так, как это:

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

У меня есть ошибки при разборе вывода сообщения об ошибке, но кажется, что в зависимости от bimap не нравится константная-ность и/или эталонность этого (и да, я знаю, что это 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) 

(Edit для решения вопроса комментариев sehe и указать на проблему)

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

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

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

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

+1

Вы должны показать свой фактический код. Проведя время, я смог/угадал/вашу вероятную проблему, но если бы вы включили SSCCE и фактические сообщения компилятора, вы бы спасли себя (и других) много времени. – sehe

+0

См. Также ** [Никто больше не пишет тестовые ящики] (http://kera.name/articles/2013/10/nobody-writes-testcases-any-more/) ** и ** [Решите свою проблему, попросив вопрос о Stackoverflow] (http://blog.jerryorr.com/2014/04/solve-your-problem-by-almost-asking.html) **. – sehe

ответ

0

Нет проблем.

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

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

Live On Coliru (Неконстантный)

Live On 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 
+0

Не технически проблема, и я думаю, что ваши ссылки были немного выше, но спаривание кода, подлежащего публикации, привело меня к проблеме, поэтому я дам вам ответ. – Melasoul

Смежные вопросы