以下给了我编译器错误:
#include <memory>
class Foo
{
public:
template<typename R>
void Bar(std::weak_ptr<R> const & p)
{
p;
}
};
int main(void)
{
auto foo = Foo();
auto integer = std::make_shared<int>();
foo.Bar(integer);
}
我试过了,
template<typename R>
void Bar(std::weak_ptr<R::element_type> const & p)
{
}
,这在语法上似乎不正确。以下工作,但我想知道是否有可能在 p 中进行转换,而无需创建另一个临时文件?
template<typename R>
void Bar(R const & p)
{
auto w = std::weak_ptr<R::element_type>(p);
}
为了清楚起见,我想明确声明该函数应该采用 shared 或weak_ptr,所以我不喜欢 R const & p 解决方案。
为了完整起见,这当然也有效:
template<typename R>
void Bar(std::shared_ptr<R> const & p)
{
auto w = std::weak_ptr<R>(p);
}
最佳答案
R
的模板参数 std::weak<R>
不能从 std::shared_ptr<A>
的实例中推导出来,因为转换构造函数(它采用 std::shared_ptr<Y>
)是一个构造函数模板,这意味着 Y
可以是任何东西——并且没有办法从 R
推导出 Y
(推导出为是 A
)。看看转换构造函数。
你可以这样写:
template<typename T>
auto make_weak(std::shared_ptr<T> s) -> std::weak_ptr<T>
{
return { s };
}
然后将其称为:
foo.Bar( make_weak(integer) );
关于c++ - 从 shared_ptr 推导出weak_ptr 参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29633463/