【问题标题】:error: no matching function for call to 'make_pair' [duplicate]错误:没有用于调用“make_pair”的匹配函数[重复]
【发布时间】:2019-09-10 11:11:01
【问题描述】:

我想把两个局部变量成对并返回,这是我的代码:

#include <utility>
class Foo {

};

class Bar {

};

std::pair<Foo, Bar> test() {
  Foo foo;
  Bar bar;
  return std::make_pair<Foo, Bar>(foo, bar);
}

我得到了

main.cpp:92:10: error: no matching function for call to 'make_pair'   
/usr/bin/../lib/gcc/x86_64-linux-gnu/7.4.0/../../../../include/c++/7.4.0/bits/stl_pair.h:524:5:
note: candidate function not viable: no known conversion from 'Foo' to 'Foo &&' for 1st argument
    make_pair(_T1&& __x, _T2&& __y)

如果我使用return std::make_pair&lt;Foo, Bar&gt;(std::move(foo), std::move(bar));,编译将成功。那我错过了什么?

【问题讨论】:

  • 在询问涉及构建错误的问题时,请包含 fullcomplete 输出。可能有信息说明可能包含有关问题的提示。

标签: c++


【解决方案1】:
template< class T1, class T2 >
std::pair<V1,V2> make_pair( T1&& t, T2&& u );

因为你在模板参数列表&lt;Foo,Bar&gt;中显式地放置了类型,所以类型推导被禁用,并且make_pair具有签名make_pair(Foo&amp;&amp;, Bar&amp;&amp;).你正在传递左值,左值不能绑定到右值引用。不要将类型放入&lt;&gt; 或使用pair&lt;Foo,Bar&gt;(foo,bar)

另一种解决方案是依靠类型推导:make_pair(foo,bar) 然后签名是make_pair(Foo&amp;, Bar&amp;),一切正常。

【讨论】:

    猜你喜欢
    • 2011-04-03
    • 1970-01-01
    • 2023-03-23
    • 2020-05-03
    • 1970-01-01
    • 2022-01-02
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多