我已将shared_ptr
作为参数运行,我希望此参数具有一些默认值。
void foo(boost::shared_ptr<myclass> ptr = nullptr);
因为ptr不是指针,而是一个类..
所以我该怎么办?
我发现了一个类似的问题: boost::shared_ptr and nullptr in default template function argument
但解决办法只是切换到std::shared_ptr
,但我不能这样做
由于
答案 0 :(得分:2)
用boost::shared_ptr
初始化nullptr
是完全可以的。它有一个特殊的构造函数:
#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
)
答案 1 :(得分:2)
由于您使用的是nullptr
,因此您必须使用C ++ 11,因此您应该可以这样做:
void foo(boost::shared_ptr<myclass> ptr = {});
这使默认参数成为默认构造的shared_ptr
,与使用nullptr
初始化的默认参数相同。它要求您的编译器支持统一初始化语法,而不是要求您的Boost版本支持从shared_ptr
构建nullptr_t
。
如果您的编译器无法处理,请使用ForEveR的答案。
答案 2 :(得分:1)
为什么不简单?
void foo(boost::shared_ptr<myclass> ptr = boost::shared_ptr<myclass>());
答案 3 :(得分:1)
我认为问题不是“正在上课”,而是涉及的构造函数是明确的。而您的表单需要隐式转换。您可以使用明确的表单来处理它:boost::shared_ptr<myclass>(nullptr)
或boost::shared_ptr<myclass>()
,无论您的版本支持哪种。