我正在混合使用C和C ++代码而且我遇到了问题。下面是不会编译的代码:
unique_ptr<char[]> buf(new char[buflen]);
snprintf(buf, buflen, procfd, fd);
导致错误:
wrapper_current.cpp:85:37:错误:无法将参数“1”的
‘std::unique_ptr<char []>’
转换为‘char*’
到‘int snprintf(char*, size_t, const char*, ...)’
我认为unique_ptr
看起来像是指向使用它的正常指针。
这有解决方法吗?
如果无法使用snprintf
那么是否有一些模仿snprintf
的C ++方法?
答案 0 :(得分:12)
std::unique_ptr<T>
有重载使它感觉像是原始指针,但它不能隐式变成T*
(因为它没有运算符T的重载)。相关的重载运算符是:
operator[]
;用于访问底层资源的第N 个元素(需要T[]
)和; operator->
;用于访问底层资源的成员,并且;; operator *
;用于获取对底层资源的引用。这些运算符充当代理&#34;对于底层资源,我们仍在 std :: unique_ptr 上调用它们,示例中的buf
将始终为std::unique_ptr
类型。
注意: unique_ptr 可以明确转换为 bool ,这样可以{{1}和相关的表达;即。在这种情况下使其表现得像原始指针。
printf 相关函数可以与原始指针一起使用,这很明显,因为智能指针不是甚至 C 的一部分(函数最初来自)。
如果您希望将原始指针添加到 std :: unique_ptr 当前管理的资源,则适合传递给 printf ,请拨打your_unique_ptr.get
,如下所示:
if (ptr) ...