2

我有这个代码:

// util.h
#include <memory>

template <class T>
class ArrayDeleter {
public:
    void operator () (T* d) const
    { delete [] d; }
};

std::shared_ptr<char, ArrayDeleter<char> > V8StringToChar(v8::Handle<v8::String> str);
std::shared_ptr<char, ArrayDeleter<char> > V8StringToChar(v8::Local<v8::Value> val);

它给了我错误:

 c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\memory
  (1418) : see declaration of 'std::tr1::shared_ptr'c:\cef\appjs_final\appjs\src\includes\util.h(27): 
error C2977: 'std::tr1::shared_ptr' : too many template arguments 
 [C:\CEF\appjs_final\appjs\build\appjs.vcxproj]
4

1 回答 1

7

与 with 不同unique_ptr,删除器不是类模板参数。删除器与使用计数一起存储在单独的对象中,因此类型擦除可用于使指针对象本身与删除器类型无关。

有构造函数模板允许您使用任何合适的仿函数类型来初始化指针。所以你的功能很简单

std::shared_ptr<char> V8StringToChar(Whatever);

他们将使用合适的删除器创建指针

return std::shared_ptr<char>(array, ArrayDeleter<char>());
于 2013-09-05T09:52:53.190 回答