在boost :: bimap中搜索当前的类实例

时间:2015-10-18 07:03:09

标签: c++ boost bimap

好的,所以我把boost :: bimap声明为:

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

对象和位置分别是类和结构。

在bimap中存储的当前对象中,我想找到自己的条目。

我目前正试图这样做:

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

我无法解析错误输出,但似乎bimap的at函数不喜欢这个的常量和/或引用(是的,我知道这是一个右值)。< / p>

进行此搜索的正确/建议方法是什么?

以下是错误摘录:

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上发布的新手,我假设只是转储我的所有代码(只是包含这部分代码的自定义对象和模板是数百个线条)将被认为是不好的形式,所以我把它调整到(我认为是)最低限度仍然得到问题。

为了解决测试用例链接,我确实编写了测试用例。在这种情况下,我交换了一个bimap的向量来添加位置代码,这实际上无法编译(虽然我会说我不是很明确它是一个编译错误,而不是堆栈跟踪)。我假设你(sehe),以为我在谈论运行时错误,因为否则我看不到链接是如何相关的。

无论如何,我正在将代码修剪到实际最小值以重现错误,以便我可以在此处发布,然后实现实际问题。如上所示,bimap包含值< object * , position>但是尝试将自身插入bimap的类是 order 类:{ {1}}的顺序 void

所以它结果是一个简单的类型错误。对不起,大家,问一个非常愚蠢的问题。我想这就是我在凌晨3点开展项目所能得到的。

1 个答案:

答案 0 :(得分:0)

没有问题。

我能想到的唯一缺陷是你有this隐式const。在这种情况下,地图必须改为指向const object

请在此处查看此示例。取消注释// const以查看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