我正在研究完美转发的经典例子:智能指针生成器。
template<typename T>
//Return a smart pointer on the given objet
shared_ptr<T> smartPointerMaker(T&& arg)
{
return shared_ptr<T>(forward<T>(arg));
}
//In the main...
shared_ptr<int> p = smartPointerMaker(42);
但是它没有编译,说“没有匹配的函数来调用'std::shared_ptr::shared_ptr(int)'”。
发布于 2016-07-22 03:30:04
您应该使用std::make_shared()
,如果它在您的编译器中可用(它应该是这样的):
shared_ptr<int> p = make_shared<int>(42);
您的手动实现不起作用,因为您没有将输入参数传递给T
的new
形式的实例以供shared_ptr
保留。您正尝试将该参数直接传递给shared_ptr
构造函数,这不是shared_ptr
的工作方式,也是代码无法编译的原因。
您需要将参数转发给T
构造函数,并将T
的new
ed实例指针传递给shared_ptr
构造函数,例如:
template<class T, class U>
shared_ptr<T> smartPointerMaker(U&& arg)
{
return shared_ptr<T>(new T(forward<U>(arg)));
}
或者:
template<class T, class... U>
shared_ptr<T> smartPointerMaker(U&&... args)
{
return shared_ptr<T>(new T(forward<U>(args)...));
}
然后你可以这样做:
shared_ptr<int> p = smartPointerMaker<int>(42);
发布于 2016-07-22 03:27:21
如果您正确地编写了完美的转发函数,以便它转发它的参数,那么
shared_ptr<int> p = smartPointerMaker(42);
等同于:
shared_ptr<int> p = shared_ptr<int>(42);
这并不奇怪,这不能编译。
https://stackoverflow.com/questions/38505498
复制相似问题