为什么 std:map 不能接受指针作为键值?
Why std:map can't accept a pointer as key-value?
我正在尝试实现将MUTEX对象放在映射中的JNI函数。编译时,我会遇到错误" ...因为JNI通过指针",并且我在参数中转换。
为什么std:map
不能接受指针作为键值?
给出错误的指令是这样的:
std::pair<_jobject , boost::fibers::recursive_mutex> v =
std::pair<_jobject , boost::fibers::recursive_mutex>(*ref, *new boost::fibers::recursive_mutex());
#include <jni.h>
#include <map>
#include "ext_concurrent_fiber_FiberLock.h"
#include <boost/fiber/recursive_mutex.hpp>
std::map<_jobject, boost::fibers::recursive_mutex> mutexes;
boost::fibers::recursive_mutex lock;
// ‘std::pair<_jobject*, boost::fibers::recursive_mutex>::
//pair(_jobject&, boost::fibers::recursive_mutex&)’
// mutexes.insert(std::pair<jobject , boost::fibers::recursive_mutex>((_jobject&)ref, *new boost::fibers::recursive_mutex()));
JNIEXPORT jboolean JNICALL Java_ext_concurrent_fiber_FiberLock_setLockIfNotPresent
(JNIEnv * env, jclass clazz, jobject ref){
lock.lock();
std::map<_jobject, boost::fibers::recursive_mutex>::iterator i =mutexes.find(*ref);
if(i == mutexes.end())
{
std::pair<_jobject , boost::fibers::recursive_mutex> v
=std::pair<_jobject , boost::fibers::recursive_mutex>(*ref, *new boost::fibers::recursive_mutex());
mutexes.insert(v);
lock.unlock();
return true;
}
lock.unlock();
return false;
}
下面您可以看到日志:
jni:
[echo] Generating JNI headers
[exec] mkdir -p target/c++
[exec] g++ -c -Wall -fPIC -I/usr/lib/jvm/java-8-oracle/include/ -I/usr/lib/jvm/java-8-oracle/include/linux -I/usr/include/boost_1_66_0 -o target/c++/ext_concurrent_fiber_NativeFiber.o src/main/c++/ext_concurrent_fiber_NativeFiber.cpp
[exec] mkdir -p target/c++
[exec] g++ -c -Wall -fPIC -I/usr/lib/jvm/java-8-oracle/include/ -I/usr/lib/jvm/java-8-oracle/include/linux -I/usr/include/boost_1_66_0 -o target/c++/ext_concurrent_fiber_FiberLock.o src/main/c++/ext_concurrent_fiber_FiberLock.cpp
[exec] src/main/c++/ext_concurrent_fiber_FiberLock.cpp: In function ‘jboolean Java_ext_concurrent_fiber_FiberLock_setLockIfNotPresent(JNIEnv*, jclass, jobject)’:
[exec] src/main/c++/ext_concurrent_fiber_FiberLock.cpp:21:105: error: no matching function for call to ‘std::pair<_jobject, boost::fibers::recursive_mutex>::pair(_jobject&, boost::fibers::recursive_mutex&)’
[exec] =std::pair<_jobject , boost::fibers::recursive_mutex>(*ref, *new boost::fibers::recursive_mutex());
[exec] ^
[exec] In file included from /usr/include/c++/6/bits/stl_algobase.h:64:0,
[exec] from /usr/include/c++/6/bits/stl_tree.h:63,
[exec] from /usr/include/c++/6/map:60,
[exec] from src/main/c++/ext_concurrent_fiber_FiberLock.cpp:3:
[exec] /usr/include/c++/6/bits/stl_pair.h:423:9: note: candidate: template<class ... _Args1, long unsigned int ..._Indexes1, class ... _Args2, long unsigned int ..._Indexes2> std::pair<_T1, _T2>::pair(std::tuple<_Args1 ...>&, std::tuple<_Args2 ...>&, std::_Index_tuple<_Indexes1 ...>, std::_Index_tuple<_Indexes2 ...>)
[exec] pair(tuple<_Args1...>&, tuple<_Args2...>&,
[exec] ^~~~
[exec] /usr/include/c++/6/bits/stl_pair.h:423:9: note: template argument deduction/substitution failed:
[exec] src/main/c++/ext_concurrent_fiber_FiberLock.cpp:21:105: note: ‘_jobject’ is not derived from ‘std::tuple<_Args1 ...>’
[exec] =std::pair<_jobject , boost::fibers::recursive_mutex>(*ref, *new boost::fibers::recursive_mutex());
[exec] ^
[exec] In file included from /usr/include/c++/6/bits/stl_algobase.h:64:0,
[exec] from /usr/include/c++/6/bits/stl_tree.h:63,
[exec] from /usr/include/c++/6/map:60,
[exec] from src/main/c++/ext_concurrent_fiber_FiberLock.cpp:3:
[exec] /usr/include/c++/6/bits/stl_pair.h:356:9: note: candidate: template<class ... _Args1, class ... _Args2> std::pair<_T1, _T2>::pair(std::piecewise_construct_t, std::tuple<_Args1 ...>, std::tuple<_Args2 ...>)
[exec] pair(piecewise_construct_t, tuple<_Args1...>, tuple<_Args2...>);
[exec] ^~~~
[exec] /usr/include/c++/6/bits/stl_pair.h:356:9: note: template argument deduction/substitution failed:
[exec] src/main/c++/ext_concurrent_fiber_FiberLock.cpp:21:105: note: ‘boost::fibers::recursive_mutex’ is not derived from ‘std::tuple<_Args1 ...>’
[exec] =std::pair<_jobject , boost::fibers::recursive_mutex>(*ref, *new boost::fibers::recursive_mutex());
[exec] ^
您的问题与指针无关。问题是您要在地图中存储的对象类型是不可复制的,因此您无法构造它们,然后将它们复制到地图中。相反,您可以告诉地图将它们直接构造到位:
std::map<jobject, boost::fibers::recursive_mutex> mutexes;
boost::fibers::recursive_mutex lock;
JNIEXPORT jboolean JNICALL
Java_ext_concurrent_fiber_FiberLock_setLockIfNotPresent(JNIEnv* env, jclass clazz, jobject ref)
{
std::lock_guard<boost::fibers::recursive_mutex> lck(lock);
auto i = mutexes.find(ref);
if(i == mutexes.end())
{
mutexes.emplace(std::piecewise_construct,
std::forward_as_tuple(ref),
std::tuple<>{});
return true;
}
return false;
}
在这里,我已经将std::map::emplace
与std::pair
的std::piecewise_construct
构造函数一起使用,告诉地图以构造其元素的位置。这样,不需要将静音复制到地图中。
相关文章:
- 使用一个考虑到std::map中键值的滚动或换行的键
- 如何使用 std::variant 打印地图键/值?
- 当键值是 std 向量时,为什么使用 at in C++ 访问映射值如此缓慢?
- C++ 映射的键/值的用户自定义名称?
- 试图(稍微)概括C++模板.关联容器键:值反转
- 更改多重映射容器中所有元素的键值
- 如何使用C++和Boost Asio从HTTP发布请求中获取键值
- 插入新键时,它会更改现有键值的地址吗?
- 在C++中共享键值对的最佳方式
- 使用无序映射在STL中存储键值对
- c++同一个键的多个键/值对
- 如何优化C++键值程序以获得更快的运行时间
- C++:如何初始化包含具有给定键的指针列表的映射
- C++中的键值对:<val1, val2> 键<frequency>与值一样
- 在 std::unordered_map 中插入新的键/值对会导致"out of range"异常
- 如何将 JSON 键值(我使用 cpp boost 解析)存储在相关数据结构中?
- 读取数组中每个对象的所有键值对
- 如何从 c++ 列出 BDB 中的键/值
- 为什么 std:map 不能接受指针作为键值?
- 指针只是一个键值对