如何make_pair包括weak_ptr

时间:2017-07-31 06:03:33

标签: c++ smart-pointers

我想将std::make_pair()用于<weak_ptr, string>,错误是:

/usr/include/c++/4.8/bits/stl_pair.h:276:5: note: template<class _T1, class _T2> constexpr std::pair<typename std::__decay_and_strip<_Tp>::__type, typename std::__decay_and_strip<_T2>::__type> std::make_pair(_T1&&, _T2&&)
     make_pair(_T1&& __x, _T2&& __y)
     ^
/usr/include/c++/4.8/bits/stl_pair.h:276:5: note:   template argument deduction/substitution failed:
.build/experimental_trusty/data_provider/Dataserver.cc:112:109: note:   cannot convert 'hdl' (type 'websocketpp::connection_hdl {aka std::weak_ptr<void>}') to type 'std::weak_ptr<void>&&'

为什么呢?如何解决?

1 个答案:

答案 0 :(得分:1)

您没有向我们展示您的代码,但根据您发布的错误,这是我的猜测。

另外,请更好地研究。我在这个网站上已经多次看到过同样的问题了。顺便说一句,this documentation就如何使用该功能有很好的例子。

我的猜测是你有这个代码:

auto p = std::make_pair<websocketpp::connection_hdl, std::string>(hdl, str);

这不是调用此函数的正确方法。

实际上,std::make_pair主要用于模板参数推导。这是编译器根据发送给函数的参数推断出模板参数应该是什么的机制。

例如,如果我写这个:

template<typename T>
void foo(T) {}

我可以这样称呼它:

foo(4.7);

编译器会推断出Tdouble

在你的情况下,你应该这样写:

auto p = std::make_pair(hdl, str);

让扣除发生。