no matching function for call to ‘construct_at(std::pair<const std::__cxx11::bas...

2025年11月25日 20:07 状态: processing

🚨 错误信息

/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_ptrstd::pair 对象。

错误位置:在 Node_Person.cpp 文件的第5行开始的 #include 触发的模板实例化过程中,具体是在哈希表复制构造时发生的。

技术细节

  • 代码使用了包含 std::unique_ptrstd::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. 开发工具推荐

  • 静态分析工具:使用 Clang-Tidy 检查不合理的拷贝操作
  • 编译选项:开启 -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 模式。