总结:将 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/