在函数声明中演绎shared_ptr T.

时间:2016-10-05 10:53:10

标签: c++ templates c++11 shared-ptr

我想编写一个如下所示的函数:

template<class T>
void Foo(const std::shared_ptr<const T>& ptr);

所以我可以这样称呼它:

std::shared_ptr<int> ptr;
Foo(ptr);

然而,编译器无法推断T,我必须明确:

Foo<int>(ptr);

或用void Foo(const std::shared_ptr<T>& ptr)重载它。

我可以使用Foo生成一个const T声明,以便推断出T吗?

1 个答案:

答案 0 :(得分:10)

您的问题是,ptr被声明为std::shared_ptr<int>foo需要std::shared_ptr<const int>。要么使用const限定符声明ptr

std::shared_ptr<const int> ptr;
Foo(ptr);

或者从foo

的声明中删除const限定符
template<class T>
void Foo(const shared_ptr<T>& ptr);

或者,除非您确实需要在foo知道您正在处理shared_ptr,否则请foo真正通用:

template<class T>
void Foo(const T& ptr);