- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
此代码使用 visual studio 2015 编译。
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/hashed_index.hpp>
#include <boost/multi_index/key_extractors.hpp>
#include <boost/multi_index/sequenced_index.hpp>
#include <boost/multi_index/random_access_index.hpp>
#include <memory>
namespace bmi = boost::multi_index;
class Link {};
typedef std::shared_ptr<Link> Link_Ptr;
struct ByRnd {};
struct ByPtr {};
typedef boost::multi_index_container<Link_Ptr,
bmi::indexed_by<
bmi::random_access<
bmi::tag<ByRnd>
>,
bmi::hashed_unique<
bmi::tag<ByPtr>,
bmi::const_mem_fun<Link_Ptr, Link*, &Link_Ptr::get>
>
>
> Store;
Store store;
int main() {}
但是,在 Ubuntu 上我使用的是 GCC 6.2 和 boost 1.62。我收到以下错误:
error:
could not convert template argument ‘&std::__shared_ptr<Link, (__gnu_cxx::_Lock_policy)2u>::get’ to ‘Link* (std::shared_ptr<Link>::*)() const’
bmi::const_mem_fun<Link_Ptr, Link*, &Link_Ptr::get>
和 clang 3.8:
error:
non-type template argument of type 'Link *(std::__shared_ptr<Link, __gnu_cxx::_Lock_policy::_S_atomic>::*)() const noexcept' cannot be converted to a value of type
'Link *(std::shared_ptr<Link>::*)() const'
bmi::const_mem_fun<Link_Ptr, Link*, &Link_Ptr::get>
如果我改用 boost::shared_ptr
,GCC 编译也很好。
最佳答案
Looks like a QoI issue with GNU libstdc++. – sehe 1 hour ago
What does that mean? Is there anything I can do about it? – ziv 15 secs ago
它的意思是“实现质量”,这意味着库实现中未指定的细节让生活变得比您想要的更难(可能是由于 namespace 版本控制,但我猜测有点)。
看起来你只想使用指针身份,这样更容易:
bmi::hashed_unique<bmi::tag<struct ByPtr>, bmi::identity<Link_Ptr> >
#include <boost/multi_index/hashed_index.hpp>
#include <boost/multi_index/key_extractors.hpp>
#include <boost/multi_index/random_access_index.hpp>
#include <boost/multi_index/sequenced_index.hpp>
#include <boost/multi_index/identity.hpp>
#include <boost/multi_index_container.hpp>
#include <memory>
#include <iostream>
#include <cassert>
namespace bmi = boost::multi_index;
class Link {};
typedef std::shared_ptr<Link> Link_Ptr;
typedef boost::multi_index_container<
Link_Ptr,
bmi::indexed_by<bmi::random_access<bmi::tag<struct ByRnd> >,
bmi::hashed_unique<bmi::tag<struct ByPtr>, bmi::identity<Link_Ptr> > > >
Store;
Store store;
int main() {
auto a = std::make_shared<Link>();
auto b = a; // same
auto& idx = store.get<ByPtr>();
idx.insert(a);
auto res = idx.insert(b);
assert(!res.second);
std::cout << "effective number of links: " << store.size() << "\n";
}
你可以使用 bmi::global_fun
:
template <typename T> static T *get_ptr(std::shared_ptr<T> const &p)
{ return p.get(); }
#include <boost/multi_index/hashed_index.hpp>
#include <boost/multi_index/identity.hpp>
#include <boost/multi_index/key_extractors.hpp>
#include <boost/multi_index/random_access_index.hpp>
#include <boost/multi_index/sequenced_index.hpp>
#include <boost/multi_index_container.hpp>
#include <cassert>
#include <iostream>
#include <memory>
namespace bmi = boost::multi_index;
class Link {};
typedef std::shared_ptr<Link> Link_Ptr;
template <typename T> static T *get_ptr(std::shared_ptr<T> const &p) { return p.get(); }
typedef boost::multi_index_container<
Link_Ptr, bmi::indexed_by<bmi::random_access<bmi::tag<struct ByRnd> >,
bmi::hashed_unique<bmi::tag<struct ByPtr>,
bmi::global_fun<Link_Ptr const &, Link *, &get_ptr<Link> > > > >
Store;
Store store;
int main() {
auto a = std::make_shared<Link>();
auto b = a; // same
auto &idx = store.get<ByPtr>();
idx.insert(a);
auto res = idx.insert(b);
assert(!res.second);
std::cout << "effective number of links: " << store.size() << "\n";
}
关于c++ - 使用 GCC 编译 boost::multi_index 和 std::shared_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40282154/
这是我的 multi_index 代码: struct tag_type {}; typedef boost::multi_index_container, b
class ObjectStorage { private: std::string objName; int zIndex; // Refer
2个问题: 1. 我真的需要通过成员将参数传递给 modify/modify_key 吗? 2. 为什么会出现这个编译错误 要查看包含错误的完整代码,您可以查看http://coliru.stacke
我有一个包含多个 hashed_unique 索引(A、B、C)的 multi_index。 并非所有对哈希的插入都包含所有索引的信息。一些索引可能是空的。有些可能包含所有条目。 我将它们定义为 ha
为了避免 msvc2010 编译器错误,我在 composite_key 中使用用户定义的 key 提取器,如下所示: enum NodeType { TypeOne = 0, T
首先我想展示工作代码,然后解释我想如何改变。这是简单的 boost multi_index 示例: //main.cpp #include #include #inc
我有一个带有多个索引的 boost multi_index 容器。如何使用迭代时指定的自定义比较来迭代元素。 例如,假设 Element::name 和 Element::index 由 multi_
所以。我正在使用 igraph 对象,我想以特定顺序迭代顶点。顺序由称为“值”的顶点属性确定,我想按从高到低的顺序进行操作。 igraph 可以按顶点 ID 顺序将所有值作为 igraph_vecto
我想按顺序搜索 boost::multi_index 容器并按顺序获取下一个元素。 下面的代码存储了四个具有不同索引(顺序和有序)的 float 。 最后一个 if 语句是问题所在。我不知道如何编辑以
我的应用程序中有一个 boost::multi_index 容器,它包含对象的共享指针 (std::shared_ptr)。正如我从文档中了解到的那样,它创建了具有对唯一索引的双向访问的树结构。是否可
阅读 boost::multi_index 引用文献,我发现 iterator_to 方法具有恒定顺序。这怎么可能?我的意思是,如果迭代器是一个不同于它所代表的 value_type 的对象,容器怎么
其定义如下: typedef boost::multi_index_container, boost::multi_index::member, boost::mult
我正在尝试制作一个 boost::multi_index 容器,它使用带参数的成员函数作为键。 class Data { public: std::string get(const std::s
我有一个 boost::multi_index 容器。谁能告诉我如何根据某个键检索一系列迭代器?经过几个小时的搜索,我想到 lower_bound 或 upper_bound 应该可以解决问题,但我仍
这个问题在这里已经有了答案: Where and why do I have to put the "template" and "typename" keywords? (8 个答案) 关闭 5
我正在应用 boost multi_index 示例的示例 6。 https://www.boost.org/doc/libs/1_71_0/libs/multi_index/doc/examples
我有以下(简化的)代码: #include #include namespace bmi = boost::multi_index; #include #include #include u
我想在内部实现 boost 多索引两组具有相同搜索条件但不同驱逐条件的键。假设我有两组具有相同搜索条件的数据,但一组需要 100 的 MRU(最近使用)列表,另一组需要 200 的 MRU。假设条目是
我有这个结构: struct myData { unsigned long id; int age; int phone; myData(){}; myDa
假设我有一个对象,可以通过来自不同 namespace 的不同名称来标识: enum Namespace { nspaceA, nspaceB }; struct Object {
我是一名优秀的程序员,十分优秀!