摘要:将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 );
答案 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*
。我认为你的编译错误是因为第二个问题。