好的,所以我把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点开展项目所能得到的。
答案 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