与C函数混合时C ++ unique_ptr错误

时间:2014-06-11 14:29:04

标签: c++ c++11

我正在混合使用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 ++方法?

1 个答案:

答案 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) ...