no matching function for call to ‘construct_at(std::pair<const std::__cxx11::bas...
🚨 错误信息
/usr/bin/g++ -DSQLITE_ENABLE_COLUMN_METADATA -DSYSTEM_LINUX_X86_64 -Dsenseauto_data_provider_EXPORTS -I/data/gerrit/workspace_AIBox_repo/AICore/IC_NM_DataProvider/../../ThirdParty/IC_NM_ThirdParty/nlohmann/include -I/data/gerrit/workspace_AIBox_repo/AICore/IC_NM_DataProvider/../../ThirdParty/IC_NM_ThirdParty/SQLiteCpp/include -I/data/gerrit/workspace_AIBox_repo/AICore/IC_NM_DataProvider/../../ThirdParty/IC_NM_ThirdParty/SQLiteCpp/include/SQLiteCpp -I/data/gerrit/workspace_AIBox_repo/AICore/IC_NM_DataProvider/../../ThirdParty/IC_NM_ThirdParty/curl/include -I/data/gerrit/workspace_AIBox_repo/AICore/IC_NM_DataProvider/data_provider/../memory_messages/include/public -I/data/gerrit/workspace_AIBox_repo/AICore/IC_NM_DataProvider/data_provider/../memory_messages/include -I/data/gerrit/workspace_AIBox_repo/AICore/IC_NM_DataProvider/data_provider/include/public -I/data/gerrit/workspace_AIBox_repo/AICore/IC_NM_DataProvider/data_provider/include/private/log -I/data/gerrit/workspace_AIBox_repo/AICore/IC_NM_DataProvider/data_provider/include/private/graph -I/data/gerrit/workspace_AIBox_repo/AICore/IC_NM_DataProvider/data_provider/include/private/graph/data -I/data/gerrit/workspace_AIBox_repo/AICore/IC_NM_DataProvider/data_provider/include/private/relational -I/data/gerrit/workspace_AIBox_repo/AICore/IC_NM_DataProvider/data_provider/include/private/relational/data -I/data/gerrit/workspace_AIBox_repo/AICore/IC_NM_DataProvider/data_provider/include/private/vector -I/data/gerrit/workspace_AIBox_repo/AICore/IC_NM_DataProvider/data_provider/include/private/utils -I/data/gerrit/workspace_AIBox_repo/AICore/IC_NM_DataProvider/data_provider/../../../ThirdParty/IC_NM_ThirdParty/nlohmann/include -I/data/gerrit/workspace_AIBox_repo/AICore/IC_NM_DataProvider/data_provider/../../../ThirdParty/IC_NM_ThirdParty/nlohmann/include/nlohmann -I/data/gerrit/workspace_AIBox_repo/AICore/IC_NM_DataProvider/../../Vendor/IC_NM_OrinX/output/usr/local/include -I/data/gerrit/workspace_AIBox_repo/AICore/IC_NM_DataProvider/../../Vendor/IC_NM_OrinX/output/usr/local/include/sqlite3 -I/data/gerrit/workspace_AIBox_repo/AICore/IC_NM_DataProvider/deps/linux-x86_64/kuzu -I/data/gerrit/workspace_AIBox_repo/ThirdParty/IC_NM_ThirdParty/SQLiteCpp/include -I/data/gerrit/workspace_AIBox_repo/ThirdParty/IC_NM_ThirdParty/sqlite3 -fPIC -DVERSION_MAJOR=1 -DVERSION_MINOR=0 -DVERSION_PATCH=1 -fPIC -std=gnu++20 -fPIC -MD -MT data_provider/CMakeFiles/senseauto_data_provider.dir/src/graph/data/Node_Person.cpp.o -MF CMakeFiles/senseauto_data_provider.dir/src/graph/data/Node_Person.cpp.o.d -o CMakeFiles/senseauto_data_provider.dir/src/graph/data/Node_Person.cpp.o -c /data/gerrit/workspace_AIBox_repo/AICore/IC_NM_DataProvider/data_provider/src/graph/data/Node_Person.cpp
In file included from /usr/include/c++/11/ext/alloc_traits.h:34,
from /usr/include/c++/11/bits/stl_tree.h:67,
from /usr/include/c++/11/map:60,
from /data/gerrit/workspace_AIBox_repo/AICore/IC_NM_DataProvider/data_provider/src/graph/data/Node_Person.cpp:5:
/usr/include/c++/11/bits/alloc_traits.h: In instantiation of ‘static constexpr void std::allocator_traits<std::allocator<_Up> >::construct(std::allocator_traits<std::allocator<_Up> >::allocator_type&, _Up*, _Args&& ...) [with _Up = std::pair<const std::__cxx11::basic_string<char>, std::unique_ptr<kuzu::common::Value> >; _Args = {const std::pair<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::unique_ptr<kuzu::common::Value, std::default_delete<kuzu::common::Value> > >&}; _Tp = std::__detail::_Hash_node<std::pair<const std::__cxx11::basic_string<char>, std::unique_ptr<kuzu::common::Value> >, true>; std::allocator_traits<std::allocator<_Up> >::allocator_type = std::allocator<std::__detail::_Hash_node<std::pair<const std::__cxx11::basic_string<char>, std::unique_ptr<kuzu::common::Value> >, true> >]’:
/usr/include/c++/11/bits/hashtable_policy.h:1878:36: required from ‘std::__detail::_Hashtable_alloc<_NodeAlloc>::__node_type* std::__detail::_Hashtable_alloc<_NodeAlloc>::_M_allocate_node(_Args&& ...) [with _Args = {const std::pair<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::unique_ptr<kuzu::common::Value, std::default_delete<kuzu::common::Value> > >&}; _NodeAlloc = std::allocator<std::__detail::_Hash_node<std::pair<const std::__cxx11::basic_string<char>, std::unique_ptr<kuzu::common::Value> >, true> >; std::__detail::_Hashtable_alloc<_NodeAlloc>::__node_ptr = std::allocator<std::__detail::_Hash_node<std::pair<const std::__cxx11::basic_string<char>, std::unique_ptr<kuzu::common::Value> >, true> >::value_type*]’
/usr/include/c++/11/bits/hashtable_policy.h:168:32: required from ‘std::__detail::_AllocNode<_NodeAlloc>::__node_type* std::__detail::_AllocNode<_NodeAlloc>::operator()(_Arg&&) const [with _Arg = const std::pair<const std::__cxx11::basic_string<char>, std::unique_ptr<kuzu::common::Value> >&; _NodeAlloc = std::allocator<std::__detail::_Hash_node<std::pair<const std::__cxx11::basic_string<char>, std::unique_ptr<kuzu::common::Value> >, true> >; std::__detail::_AllocNode<_NodeAlloc>::__node_type = std::__detail::_AllocNode<std::allocator<std::__detail::_Hash_node<std::pair<const std::__cxx11::basic_string<char>, std::unique_ptr<kuzu::common::Value> >, true> > >::__node_type]’
/usr/include/c++/11/bits/hashtable.h:1306:20: required from ‘void std::_Hashtable<_Key, _Value, _Alloc, _ExtractKey, _Equal, _Hash, _RangeHash, _Unused, _RehashPolicy, _Traits>::_M_assign(_Ht&&, const _NodeGenerator&) [with _Ht = const std::_Hashtable<std::__cxx11::basic_string<char>, std::pair<const std::__cxx11::basic_string<char>, std::unique_ptr<kuzu::common::Value> >, std::allocator<std::pair<const std::__cxx11::basic_string<char>, std::unique_ptr<kuzu::common::Value> > >, std::__detail::_Select1st, std::equal_to<std::__cxx11::basic_string<char> >, std::hash<std::__cxx11::basic_string<char> >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true, false, true> >&; _NodeGenerator = std::__detail::_AllocNode<std::allocator<std::__detail::_Hash_node<std::pair<const std::__cxx11::basic_string<char>, std::unique_ptr<kuzu::common::Value> >, true> > >; _Key = std::__cxx11::basic_string<char>; _Value = std::pair<const std::__cxx11::basic_string<char>, std::unique_ptr<kuzu::common::Value> >; _Alloc = std::allocator<std::pair<const std::__cxx11::basic_string<char>, std::unique_ptr<kuzu::common::Value> > >; _ExtractKey = std::__detail::_Select1st; _Equal = std::equal_to<std::__cxx11::basic_string<char> >; _Hash = std::hash<std::__cxx11::basic_string<char> >; _RangeHash = std::__detail::_Mod_range_hashing; _Unused = std::__detail::_Default_ranged_hash; _RehashPolicy = std::__detail::_Prime_rehash_policy; _Traits = std::__detail::_Hashtable_traits<true, false, true>]’
/usr/include/c++/11/bits/hashtable.h:1421:16: required from ‘std::_Hashtable<_Key, _Value, _Alloc, _ExtractKey, _Equal, _Hash, _RangeHash, _Unused, _RehashPolicy, _Traits>::_Hashtable(const std::_Hashtable<_Key, _Value, _Alloc, _ExtractKey, _Equal, _Hash, _RangeHash, _Unused, _RehashPolicy, _Traits>&) [with _Key = std::__cxx11::basic_string<char>; _Value = std::pair<const std::__cxx11::basic_string<char>, std::unique_ptr<kuzu::common::Value> >; _Alloc = std::allocator<std::pair<const std::__cxx11::basic_string<char>, std::unique_ptr<kuzu::common::Value> > >; _ExtractKey = std::__detail::_Select1st; _Equal = std::equal_to<std::__cxx11::basic_string<char> >; _Hash = std::hash<std::__cxx11::basic_string<char> >; _RangeHash = std::__detail::_Mod_range_hashing; _Unused = std::__detail::_Default_ranged_hash; _RehashPolicy = std::__detail::_Prime_rehash_policy; _Traits = std::__detail::_Hashtable_traits<true, false, true>]’
/usr/include/c++/11/bits/unordered_map.h:181:7: required from here
/usr/include/c++/11/bits/alloc_traits.h:518:28: error: no matching function for call to ‘construct_at(std::pair<const std::__cxx11::basic_string<char>, std::unique_ptr<kuzu::common::Value> >*&, const std::pair<const std::__cxx11::basic_string<char>, std::unique_ptr<kuzu::common::Value> >&)’
518 | std::construct_at(__p, std::forward<_Args>(__args)...);
| ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/c++/11/bits/stl_iterator.h:85,
from /usr/include/c++/11/bits/stl_algobase.h:67,
from /usr/include/c++/11/bits/stl_tree.h:63,
from /usr/include/c++/11/map:60,
🤖 AI解决方案
代码报错分析报告
错误翻译
原文:no matching function for call to 'construct_at(std::pair<const std::__cxx11::basic_string<char>, std::unique_ptr<kuzu::common::Value> >*&, const std::pair<const std::__cxx11::basic_string<char>, std::unique_ptr<kuzu::common::Value> >&)'
译文:没有匹配的函数来调用 'construct_at',参数为 std::pair<const std::string, std::unique_ptr<kuzu::common::Value>> 类型的指针和引用
原因分析
根本原因:std::unique_ptr 是不可拷贝的智能指针,但代码试图在哈希表操作中拷贝包含 unique_ptr 的 std::pair 对象。
错误位置:在 Node_Person.cpp 文件的第5行开始的 #include 触发的模板实例化过程中,具体是在哈希表复制构造时发生的。
技术细节:
- 代码使用了包含
std::unique_ptr的std::pair - 当哈希表(可能是
std::unordered_map)进行复制构造时,需要拷贝元素 std::unique_ptr删除了拷贝构造函数,导致编译失败
解决方案
方案1:使用移动语义代替拷贝
// 如果确实需要"复制"哈希表,使用移动构造
std::unordered_map<std::string, std::unique_ptr<kuzu::common::Value>> newMap = std::move(oldMap);
// 或者手动转移所有权
std::unordered_map<std::string, std::unique_ptr<kuzu::common::Value>> newMap;
for (auto& pair : oldMap) {
newMap[pair.first] = std::move(pair.second);
}
方案2:使用共享指针(如果可以共享所有权)
// 将 unique_ptr 改为 shared_ptr
std::unordered_map<std::string, std::shared_ptr<kuzu::common::Value>> propertiesMap;
方案3:禁用拷贝构造,只允许移动
class Node_Person {
private:
std::unordered_map<std::string, std::unique_ptr<kuzu::common::Value>> properties_;
public:
// 禁用拷贝构造和赋值
Node_Person(const Node_Person&) = delete;
Node_Person& operator=(const Node_Person&) = delete;
// 允许移动构造和赋值
Node_Person(Node_Person&&) = default;
Node_Person& operator=(Node_Person&&) = default;
};
️ 预防措施
1. 最佳实践建议
unique_ptr,确保只进行移动操作,不进行拷贝emplace 而非 insert:直接构造元素,避免不必要的拷贝/移动2. 开发工具推荐
-Werror=delete-non-virtual-dtor 等警告选项3. 代码设计原则
// 推荐:使用工厂函数创建并插入
auto createValue() { return std::make_unique<kuzu::common::Value>(); }
// 使用 emplace 直接构造
propertiesMap.emplace("key", createValue());
// 避免:这会尝试拷贝 unique_ptr(编译错误)
// propertiesMap.insert({"key", createValue()});
关键提醒:std::unique_ptr 设计用于独占所有权,拷贝操作被明确禁用以适应 RAII 模式。