【问题标题】:How can I fix this error 'no matching function for call'?如何解决此错误“呼叫没有匹配功能”?
【发布时间】:2021-01-11 07:05:02
【问题描述】:

给定以下代码:

    std::map<std::string, std::unique_ptr<Obj>> objs;
    std::string str;
    Obj obj;
    std::unique_ptr<Obj> objUniquePtr = std::unique_ptr<Obj>(new Obj(obj));
    objs.insert({ str, objUniquePtr });   <<<<<<<< ERROR

我收到以下错误:

no matching function for call to 'std::map&lt;std::__cxx11::basic_string&lt;char&gt;, std::unique_ptr&lt;Obj&gt; &gt;::insert(&lt;brace-enclosed initializer list&gt;)'

我该如何解决这个错误?

【问题讨论】:

  • 附带说明 - 默认构造一个本地 Obj 实例只是为了 new 另一个带有它的 Obj 实例是多余的。改用std::unique_ptr&lt;Obj&gt; objUniquePtr(new Obj);,或者更好:auto objUniquePtr = std::make_unique&lt;Obj&gt;();

标签: c++ c++11 compiler-errors unique-ptr


【解决方案1】:

您正在尝试复制构造 std::unique_ptr,这是不允许的,因为无法复制构造 std::unique_ptrs。改为移动构造它并使用emplace 成员函数,以确保不会发生std::unique_ptr 的复制构造:

objs.emplace({str, std::move(objUniquePtr)}); //notice the move operation

这将解决您的错误。只需确保在移动操作后不要尝试访问或取消引用 objUniquePtr,因为您将尝试取消引用 nullptr

【讨论】:

  • 现在我收到以下错误:/usr/include/c++/4.8.2/bits/stl_tree.h:140:49: error: use of deleted function ‘constexpr std::pair&lt;_T1, _T2&gt;::pair(const std::pair&lt;_T1, _T2&gt;&amp;) [with _T1 = const std::basic_string&lt;char&gt;; _T2 = std::unique_ptr&lt;Obj&gt;]’ _M_value_field(std::forward&lt;_Args&gt;(__args)...) { }
  • 最好使用emplace() 代替:objs.emplace(str, std::move(objUniquePtr)); 甚至objs.emplace(str, std::make_unique&lt;Obj&gt;());
  • 谢谢@RemyLebeau,我错过了。我会更新答案。
  • 澄清一下,std::unique_ptr 在被移出后总是设置为nullptr
  • @FrançoisAndrieux wiki.sei.cmu.edu/confluence/display/cplusplus/… - 我的立场是正确的。我将再次编辑帖子。
猜你喜欢
  • 2020-07-07
  • 2014-12-08
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-25
相关资源
最近更新 更多