以下给了我编译器错误:


#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/

10-11 18:53