c++ - boost scoped_ptr with char* 类型抛出初始化错误

标签 c++ boost

总结:将 boost::scoped_ptr 与 char* 数据类型一起使用。我已经基于 Accelerated C++ 第 12 章编写了自己的 Str 类和函数。一切正常,但出于我的好奇心,我尝试使用 boost::scoped_ptr 但花了几个小时后我没有成功。

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

问题::错误: 没有匹配的构造函数来初始化“boost::scoped_ptr” boost::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 );

最佳答案

您遇到的错误是由以下声明初始化不匹配造成的:

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 ];
//                                       ^^^

关于c++ - boost scoped_ptr with char* 类型抛出初始化错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25713483/

相关文章:

c++ - 使用 system() 执行后台进程

c++ - 多边形上的 OpenGL 光照

c++ - Boost::regex_match 没有触发

c++ - 灵气中可选解析器的使用

c++ - boost 序列化: Transition from versioned class to object_serializable

c++ - 向 Boost 提交库的提示?

c++ - 用 "%20"替换空格 - 字符串下标超出范围

c++ - 如何在linux中检查系统时间是否有效

c++ - QUdpSocket - 数据报被接收两次,为什么?

c++ - 使用 g++ 4.8 (Mac Ports) 在 Mac OS X 上编译 boost::program_options