智能指针制造商
A smart pointer maker
我正在研究完美转发的经典示例:智能指针生成器。
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);
但是编译不通过,说"no matching function for call to 'std::shared_ptr::shared_ptr(int)'"
如果您正确地编写了完美的转发函数,使其转发了它的参数,那么
shared_ptr<int> p = smartPointerMaker(42);
相当于:
shared_ptr<int> p = shared_ptr<int>(42);
编译失败不足为奇。
你应该使用 std::make_shared()
如果它在你的编译器中可用(它应该):
shared_ptr<int> p = make_shared<int>(42);
您的手动实施不起作用,因为您没有将输入参数传递给 T
的 new
编辑实例以供 shared_ptr
保存。您试图将参数直接传递给 shared_ptr
构造函数,这不是 shared_ptr
的工作方式,也是代码编译失败的原因。
您需要将参数转发给T
构造函数,并将new
ed实例指针传递给T
构造函数,例如:
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);
我正在研究完美转发的经典示例:智能指针生成器。
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);
但是编译不通过,说"no matching function for call to 'std::shared_ptr::shared_ptr(int)'"
如果您正确地编写了完美的转发函数,使其转发了它的参数,那么
shared_ptr<int> p = smartPointerMaker(42);
相当于:
shared_ptr<int> p = shared_ptr<int>(42);
编译失败不足为奇。
你应该使用 std::make_shared()
如果它在你的编译器中可用(它应该):
shared_ptr<int> p = make_shared<int>(42);
您的手动实施不起作用,因为您没有将输入参数传递给 T
的 new
编辑实例以供 shared_ptr
保存。您试图将参数直接传递给 shared_ptr
构造函数,这不是 shared_ptr
的工作方式,也是代码编译失败的原因。
您需要将参数转发给T
构造函数,并将new
ed实例指针传递给T
构造函数,例如:
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);