0

我有 boostshared_ptr作为函数的参数,我希望这个参数有一些默认值。

void foo(boost::shared_ptr<myclass> ptr = nullptr);

因为 ptr 不是指针,而是类..

那我该怎么办?

我发现了一个类似的问题: 默认模板函数参数中的 boost::shared_ptr 和 nullptr

但是那里的解决方案只是切换到std::shared_ptr,但我做不到

谢谢

4

4 回答 4

2

用 初始化是完全可以boost::shared_ptrnullptr。它有一个特殊的构造函数:

#if !defined( BOOST_NO_CXX11_NULLPTR )
shared_ptr( boost::detail::sp_nullptr_t ) BOOST_NOEXCEPT : px( 0 ), pn() // never throws
{
}
#endif

(以便携式方式boost::detail::sp_nullptr_t解析)nullptr_t

于 2013-06-26T13:35:38.700 回答
2

由于您正在使用nullptr,您必须使用 C++11,所以您应该能够做到这一点:

void foo(boost::shared_ptr<myclass> ptr = {});

这使得默认参数成为 default-constructed shared_ptr,与使用 初始化的参数相同nullptr。它要求您的编译器支持统一的初始化语法,而不是要求您的 Boost 版本支持shared_ptrnullptr_t.

如果您的编译器无法处理,请使用 ForEveR 的答案。

于 2013-06-26T13:42:17.730 回答
1

为什么不简单呢?

void foo(boost::shared_ptr<myclass> ptr = boost::shared_ptr<myclass>());
于 2013-06-26T13:27:04.817 回答
1

我认为问题不在于“成为类”,而是所涉及的构造函数是明确的。而且您的表单需要隐式转换。您可以使用显式形式来解决它:boost::shared_ptr<myclass>(nullptr)boost::shared_ptr<myclass>(),无论您的版本支持哪种形式。

于 2013-06-26T13:30:33.427 回答