C++ 在返回共享\u ptr的函数中返回新内容
我有一个函数,它将共享的ptr返回给const对象。返回由运算符new works返回的指针构造的共享_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
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 );