使用char *类型提​​升scoped_ptr会引发初始化错误

时间:2014-09-07 18:33:59

标签: c++ boost

摘要:将boost :: scoped_ptr与char *数据类型一起使用。我已经编写了基于Accelerated C ++ chap12的自己的Str类和函数。一切都很好但只是为了我的好奇心,我试图使用boost :: scoped_ptr但是花了几个小时后我没有成功。

需要注意的是:如果我不使用boost ptr,一切都按预期工作。

问题::错误:没有用于初始化'boost :: scoped_ptr'的匹配构造函数     升压:: scoped_ptr的< char *> buffer_smrt_ptr(buffer);                                ^ ~~~~~~

以下是我的代码

// test of copy function
    Str test_cpy( "String copy test");
    char* buffer = new char[ test_cpy.size() ];
    boost::scoped_ptr< char* > buffer_smrt_ptr( buffer );
    Str::size_type n_len  = test_cpy.copy( buffer_smrt_ptr,10, 0);
    buffer_smrt_ptr[  n_len ] = '\0';
    printf( "your  copied string: == %s\n", buffer );

2 个答案:

答案 0 :(得分:4)

您遇到的错误来自以下声明 - 初始化不匹配:

boost::scoped_ptr< char* > buffer_smrt_ptr( buffer );
//                     ^

也就是说,在声明<T> boost::scoped_ptr<T>类型时,它不是指向存储值的指针的类型,而是类型的指向值本身。因此,星号是多余的,应该删除。

但是,为了存储指向动态分配的数组的指针并通过operator[]访问它们的值,应该使用boost::scoped_array<T>代替:

Str test_cpy( "String copy test" );
char* buffer = new char[ test_cpy.size() ];
boost::scoped_array< char > buffer_smrt_ptr( buffer );
//            ^^^^^  ^^^^

此外,boost::scoped_ptr<T>(以及boost::scoped_array<T>)是不可复制的类型,如果您打算将其传递给Str::copy()成员函数,请通过引用捕获它或获取原始指针:

Str::size_type n_len = test_cpy.copy(buffer_smrt_ptr.get(), 10, 0);
//                                                  ^^^^^^

更进一步,如果您的test_cpy.size()成员函数返回的字符串长度没有尾随\0,则可能需要将缓冲区增加一个字符:

char* buffer = new char[ test_cpy.size() + 1 ];
//                                       ^^^

答案 1 :(得分:2)

您应该使用boost::scoped_array代替boost::scoped_ptr。它是用于管理阵列的智能指针。此外,其模板类型应为char,而不是char*。我认为你的编译错误是因为第二个问题。