gpt4 book ai didi

c++ - 在返回 shared_ptr 的函数中返回新的东西

转载 作者:太空宇宙 更新时间:2023-11-04 16:09:19 27 4
gpt4 key购买 nike

我有一个将 shared_ptr 返回给常量对象的函数。返回由 operator 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:\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 );
}
}

类是:

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 的构造函数。

最佳答案

那是因为the constructor of std::shared_ptr is explicit ,因此在返回语句中,编译器在尝试构造返回对象时无法将原始指针隐式转换为 std::shared_ptr。您必须返回一个std::shared_ptr

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

constexpr shared_ptr( std::nullptr_t );

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

error: could not convert from 'int*' to 'std::shared_ptr'

关于c++ - 在返回 shared_ptr 的函数中返回新的东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30425194/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com