在返回shared_ptr的函数中返回新的东西
Return new something in function returning a shared_ptr
我有一个函数,它将shared_ptr返回给const对象。返回由操作符new返回的指针构造的shared_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:xxxvalue.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 );
}
}
类是:
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;
};
我不认为这是c++ 11特有的东西,但我是c++ 11的新手,所以我不确定。我不明白为什么不是两种方式都返回指针工作,为什么编译器自动选择期望nullptr_t的构造函数。
这是因为std::shared_ptr
的构造函数是显式的,因此在返回语句中,编译器在试图构造返回对象时不能将原始指针隐式地转换为std::shared_ptr
。必须返回一个std::shared_ptr
。
你正在看到一个奇怪的错误,因为编译器试图将原始指针参数匹配到非显式构造函数(这里的数字5)
constexpr shared_ptr( std::nullptr_t );
虽然g++/clang++在诊断问题时更有帮助,但示例错误:
错误:无法从'int*'转换为'std::shared_ptr'
相关文章:
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 接收和返回函数指针的函数指针的类型?
- 我的动态链接队列在同一输出流中调用时不正确地输出三个返回函数
- C++函数链返回函数
- 返回函数指针的函数的签名
- 由于值返回函数中的错误,程序无法编译.它说未声明的标识符
- 非常量引用返回函数在常量值返回函数上用作 r 值
- 如何在 C++ 中从 void 返回函数访问变量
- 返回函数中带有 2 个可选 ctor 的对象
- 如何在 c++ 中返回函数的结构向量
- 返回 C++ 函数中的引用
- 使用向量时,当返回函数更改时,无法看到输出
- 如何在递归中使用返回函数
- 返回函数模板的类型C++作为第二个模板参数
- 为什么静态指针返回函数中有一个"静态"键?
- 递归返回函数,在特殊情况下不返回
- 从类返回函数
- 从类成员函数返回函数指针
- 从返回函数中推断不存在的模板参数