Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将派生的'shared_ptr'接受给接受'T const&;的构造函数?_C++ - Fatal编程技术网

C++ 如何将派生的'shared_ptr'接受给接受'T const&;的构造函数?

C++ 如何将派生的'shared_ptr'接受给接受'T const&;的构造函数?,c++,C++,我有一个类用来组合一个值和一个错误代码。简化形式如下所示: template<typename T> struct wrapper { T result; err_enum err; wrapper( T const & result ) : result( result ) { err = err_okay; } } 我被迫做: return wrapper<shared_ptr<base co

我有一个类用来组合一个值和一个错误代码。简化形式如下所示:

template<typename T>
struct wrapper {
    T result;
    err_enum err;

    wrapper( T const & result ) :
        result( result ) {
        err = err_okay;
    }
}
我被迫做:

return wrapper<shared_ptr<base const>>(make_shared<derived>());
返回包装器(make_shared());
如何编写我的
包装器
类,以便允许这种隐式转换


请注意,
包装器
类还必须接受除
共享\u ptr
以外的类型,例如普通结构/类类型。

添加模板构造函数(可以选择完美转发):

模板
包装器(X&&result):
结果(std::forward(result))/*错误代码*/{}

这允许您的包装器由任何可转换为其成员类型的内容构建。但是请注意,您可能需要一些额外的SFINAE逻辑,以便从这个模板化构造函数中排除复制/移动构造函数。

For
return make_shared()
,您将返回一个
std::shared_ptr
,但返回类型为
包装器
。然后它必须隐式转换为
std::shared_ptr
,然后转换为
包装器
。但在一个转换序列中只允许一个用户定义的转换

要解决此问题,您可以按照所示显式返回一个
包装器
,或者只返回一个
共享的\u ptr
,如:

return shared_ptr<base const>{make_shared<derived>()};
返回shared_ptr{make_shared()};
return wrapper<shared_ptr<base const>>(make_shared<derived>());
template <typename X>
wrapper( X && result) :
    result ( std::forward<X>(result)) /* error_code */ {}
return shared_ptr<base const>{make_shared<derived>()};