Индекс с повышением multi_index

Как я могу проиндексировать контейнер boost::multi_index, используя функцию-член класса (которая хранится в multi_index), которая возвращает постоянную ссылку другого класса?

Ошибка, которую я получаю:

error C2440: 'specialization' : cannot convert from 'overloaded-function' to 'RetClass (__thiscall StoreMe::* )(void) const'

Редактировать1:

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

#include "stdafx.h"
#include<multi_index_container.hpp>
#include<boost/multi_index/hashed_index.hpp>
#include<boost/multi_index/mem_fun.hpp>


class RetClass
{
    int a, b;

};

class StoreMe
 {
    RetClass ex;
public:
    void setId(RetClass a) {
        ex = a;
    };


    virtual const RetClass& getId() const { return ex; }

};

typedef boost::multi_index_container<
    StoreMe,
    boost::multi_index::indexed_by<
        boost::multi_index::hashed_non_unique<boost::multi_index::const_mem_fun<StoreMe,     RetClass, &StoreMe::getId> >
    >
> mi_storeMe;

int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}

ТИА

-R


person codeworks    schedule 18.10.2016    source источник


Ответы (1)


Используйте boost::multi_index::const_mem_fun.

Отредактировано после дополнительной информации OP: тип возвращаемого значения, указанный в const_mem_fun, должен быть точно таким же, как у функции, которую вы хотите использовать для индексации. Обратите внимание на различия в вашем текущем коде:

virtual const RetClass& getId() const;
const_mem_fun<StoreMe, RetClass, &StoreMe::getId>

Итак, измените часть const_mem_fun следующим образом:

const_mem_fun<StoreMe, const RetClass&, &StoreMe::getId> 
person Joaquín M López Muñoz    schedule 18.10.2016
comment
Да, это то, что я уже использую, это именно то, что я использую, - person codeworks; 19.10.2016
comment
Моя функция: виртуальный const RetClass и getId() const {return Id; } Я использую: boost::multi_index::hashed_non_unique‹boost::multi_index::const_mem_fun‹StoreMe, RetClass, &StoreMe::getId› › И тогда я получаю сообщение об ошибке. - person codeworks; 19.10.2016
comment
Создал поддающийся проверке образец, который я добавил к вопросу @Joaquín M López Muñoz. ТИА! - person codeworks; 19.10.2016
comment
Кроме того, @Joaquin, если у меня по ошибке есть индекс hashed_unique и у меня были добавлены дубликаты, будет ли заменено мое значение и останется только последнее значение? - person codeworks; 19.10.2016
comment
Также из документации я понимаю, что скорость вставки составляет O (1), а поиск также O (1) при использовании hashed_unique. Я прав? Что в случае hashed_non_unique? Я имею в виду средний случай. - person codeworks; 19.10.2016
comment
Точную информацию можно найти по ссылке: boost.org/ libs/multi_index/doc/reference/ boost. org/libs/multi_index/doc/reference/ boost.org/libs/multi_index/doc/reference/ - person Joaquín M López Muñoz; 19.10.2016
comment
Спасибо Хоакин! Это помогло! В моей проблеме я могу создать контейнер multi_index, и при вставке компилятор жалуется, что ...functional\hash\extensions.hpp(262): error C2664: 'size_t boost::hash_value(std::type_index)' : невозможно преобразовать аргумент 1 из 'const RetClass' в 'std::type_index'. Нужно ли мне создавать функцию сравнения или что-то в этом роде? И если да, то как мне сообщить, что это функция для использования? - person codeworks; 19.10.2016
comment
Я решил проблему, сделав это. @Joaquin, пожалуйста, дайте мне знать, правильно ли это? Функция, которую я хочу использовать, возвращает класс, который представляет собой оболочку строки с МНОЖЕСТВОМ функций, поэтому это выглядело так: virtual const RetClass& getId() const { return parentclass.Id; } Я написал другую функцию, например, virtual std::string getIdString() const { return string((parentclass.Id).tocharptr()); } ПРИМЕЧАНИЕ: tocharptr() — это метод RetClass, который будет вернуть char* RetClass - person codeworks; 19.10.2016