Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.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++ 在返回共享\u ptr的函数中返回新内容_C++_Constructor_Return_Shared Ptr_Implicit Conversion - Fatal编程技术网

C++ 在返回共享\u ptr的函数中返回新内容

C++ 在返回共享\u ptr的函数中返回新内容,c++,constructor,return,shared-ptr,implicit-conversion,C++,Constructor,Return,Shared Ptr,Implicit Conversion,我有一个函数,它将共享的ptr返回给const对象。返回由运算符new works返回的指针构造的共享_ptr,但返回该指针会直接导致编译错误: Error 3 error C2664: 'std::shared_ptr<_Ty>::shared_ptr(std::nullptr_t)' : cannot convert parameter 1 from 'script::float_data *' to 'std::nullptr_t' c:\xxx\value.cp

我有一个函数,它将共享的ptr返回给const对象。返回由运算符new works返回的指针构造的共享_ptr,但返回该指针会直接导致编译错误:

Error   3   error C2664: 'std::shared_ptr<_Ty>::shared_ptr(std::nullptr_t)' : cannot convert parameter 1 from 'script::float_data *' to 'std::nullptr_t'    c:\xxx\value.cpp    59
错误3错误C2664:'std::shared_ptr::shared_ptr(std::nullptr_t)':无法将参数1从'script::float_data*'转换为'std::nullptr_t'c:\xxx\value.cpp 59
以下是导致错误的代码:

shared_ptr< const data > float_data::operator + ( shared_ptr< const data > rhs ) const
{
    int rhs_as_int; float rhs_as_float;

    switch( rhs->to_numeric( rhs_as_int, rhs_as_float ) )
    {
    case E_INT:
        return new float_data( val + rhs_as_int );
    case E_FLOAT:
        return new float_data( val + rhs_as_float );
    }
}
shared_ptrfloat_data::operator+(shared_ptrrhs)const
{
int rhs_as_int;浮点rhs_as_float;
开关(rhs->到数值(rhs作为内部,rhs作为浮动))
{
案例E_INT:
返回新的浮点数据(val+rhs作为int);
案例E_浮动:
返回新的浮点数据(val+rhs作为浮点);
}
}
课程包括:

class data
{
public:

    enum type
    {
        E_INT,
        E_FLOAT,
        E_STRING
    };

public:

    virtual ~data() { }

public:

    virtual std::shared_ptr< const data > operator + ( std::shared_ptr< const data > rhs ) const = 0;

    virtual std::shared_ptr< const data > operator - ( std::shared_ptr< const data > rhs ) const = 0;

    virtual std::shared_ptr< const data > operator * ( std::shared_ptr< const data > rhs ) const = 0;

    virtual std::shared_ptr< const data > operator / ( std::shared_ptr< const data > rhs ) const = 0;

    virtual std::shared_ptr< data > operator = ( std::shared_ptr< const data > rhs ) = 0;

public:

    virtual type to_numeric( int & as_int, float & as_float ) const = 0;
};

class int_data : public data
{
private:

    int val;

public:

    int_data( int i );

public:

    virtual std::shared_ptr< const data > operator + ( std::shared_ptr< const data > rhs ) const;

    virtual std::shared_ptr< const data > operator - ( std::shared_ptr< const data > rhs ) const;

    virtual std::shared_ptr< const data > operator * ( std::shared_ptr< const data > rhs ) const;

    virtual std::shared_ptr< const data > operator / ( std::shared_ptr< const data > rhs ) const;

    virtual std::shared_ptr< data > operator = ( std::shared_ptr< const data > rhs );

public:

    virtual type to_numeric( int & as_int, float & as_float ) const;
};

class float_data : public data
{
private:

    float val;

public:

    float_data( float f );

public:

    virtual std::shared_ptr< const data > operator + ( std::shared_ptr< const data > rhs ) const;

    virtual std::shared_ptr< const data > operator - ( std::shared_ptr< const data > rhs ) const;

    virtual std::shared_ptr< const data > operator * ( std::shared_ptr< const data > rhs ) const;

    virtual std::shared_ptr< const data > operator / ( std::shared_ptr< const data > rhs ) const;

    virtual std::shared_ptr< data > operator = ( std::shared_ptr< const data > rhs );

public:

    virtual type to_numeric( int & as_int, float & as_float ) const;
};

class string_data : public data
{
private:

    std::string val;

public:

    string_data( const char * s );

public:

    virtual std::shared_ptr< const data > operator + ( std::shared_ptr< const data > rhs ) const;

    virtual std::shared_ptr< const data > operator - ( std::shared_ptr< const data > rhs ) const;

    virtual std::shared_ptr< const data > operator * ( std::shared_ptr< const data > rhs ) const;

    virtual std::shared_ptr< const data > operator / ( std::shared_ptr< const data > rhs ) const;

    virtual std::shared_ptr< data > operator = ( std::shared_ptr< const data > rhs );

public:

    virtual type to_numeric( int & as_int, float & as_float ) const;
};
类数据
{
公众:
枚举类型
{
E_INT,
E_FLOAT,
E_字符串
};
公众:
虚拟~data(){}
公众:
虚拟std::shared_ptroperator+(std::shared_ptrrhs)const=0;
虚拟std::shared_ptr操作符-(std::shared_ptrrhs)const=0;
虚拟std::shared_ptroperator*(std::shared_ptrrhs)const=0;
虚拟std::shared_ptr操作符/(std::shared_ptrrhs)const=0;
虚拟std::shared_ptr操作符=(std::shared_ptrrhs)=0;
公众:
虚拟类型到_numeric(int&as_int,float&as_float)常量=0;
};
类int_数据:公共数据
{
私人:
int-val;
公众:
int_数据(int i);
公众:
虚拟std::shared_ptroperator+(std::shared_ptrrhs)常量;
虚拟std::shared_ptr运算符-(std::shared_ptrrhs)常量;
虚拟std::shared_ptroperator*(std::shared_ptrrhs)常量;
虚拟std::shared_ptroperator/(std::shared_ptrrhs)const;
虚拟std::shared_ptroperator=(std::shared_ptrrhs);
公众:
虚拟类型到_numeric(int&as_int,float&as_float)常量;
};
类浮点数数据:公共数据
{
私人:
浮动增值税;
公众:
浮点数_数据(浮点数f);
公众:
虚拟std::shared_ptroperator+(std::shared_ptrrhs)常量;
虚拟std::shared_ptr运算符-(std::shared_ptrrhs)常量;
虚拟std::shared_ptroperator*(std::shared_ptrrhs)常量;
虚拟std::shared_ptroperator/(std::shared_ptrrhs)const;
虚拟std::shared_ptroperator=(std::shared_ptrrhs);
公众:
虚拟类型到_numeric(int&as_int,float&as_float)常量;
};
类字符串\u数据:公共数据
{
私人:
std::字符串val;
公众:
字符串_数据(常量字符*s);
公众:
虚拟std::shared_ptroperator+(std::shared_ptrrhs)常量;
虚拟std::shared_ptr运算符-(std::shared_ptrrhs)常量;
虚拟std::shared_ptroperator*(std::shared_ptrrhs)常量;
虚拟std::shared_ptroperator/(std::shared_ptrrhs)const;
虚拟std::shared_ptroperator=(std::shared_ptrrhs);
公众:
虚拟类型到_numeric(int&as_int,float&as_float)常量;
};
我不认为这是C++11特有的东西,但我对C++11是新手,所以我不确定。我不明白为什么返回指针的两种方法都不起作用,为什么编译器会自动选择期望为null的构造函数。这是因为,因此在return语句中,编译器在尝试构造返回对象时无法将原始指针隐式转换为
std::shared\u ptr
。您必须返回一个
std::shared\u ptr

您看到了奇怪的错误,因为编译器试图将原始指针参数与非显式构造函数()匹配

虽然g++/clang++在诊断问题时更有帮助,但示例错误:

错误:无法从“int*”转换为“std::shared\u ptr”

这是因为,因此在return语句中,编译器在尝试构造返回对象时无法将原始指针隐式转换为
std::shared_ptr
。您必须返回一个
std::shared\u ptr

您看到了奇怪的错误,因为编译器试图将原始指针参数与非显式构造函数()匹配

虽然g++/clang++在诊断问题时更有帮助,但示例错误:

错误:无法从“int*”转换为“std::shared\u ptr”


好的,谢谢你的回答。创建并返回临时共享\u ptr时是否存在性能开销?没有开销,存在RVO,这是“仿佛”规则的一个例外。在进一步考虑之后,这一点可能就足够了,不过需要进行更深入的分析。@Virus721不,一点也不,所有(体面的)编译器都执行所谓的功能。好的,谢谢你的回答。创建并返回临时共享\u ptr时是否存在性能开销?没有开销,存在RVO,这是“仿佛”规则的一个例外。进一步考虑,这一点可能就足够了,不过需要进行更深入的分析。@Virus721不,一点也不,所有(体面的)编译器都执行所谓的操作。使用
std::make_shared
。你应该真正学会删减所有不相关的代码。请参阅,以获得一个简单的示例。我选择保留类定义,以防它有影响。请使用
std::make_shared
。您应该真正学会删除所有不相关的代码。请参阅,以获得一个简单的示例。我选择保留类定义,以防它起作用
constexpr shared_ptr( std::nullptr_t );