我有这段代码:
// 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]
答案 0 :(得分:6)
与unique_ptr
不同,删除器不是类模板参数。删除器与使用计数一起存储在单独的对象中,因此 type erasure 可用于使指针对象本身与删除器类型无关。
有一些构造函数模板允许您使用任何合适的函子类型初始化指针。所以你的功能就是
std::shared_ptr<char> V8StringToChar(Whatever);
他们将使用合适的删除器
创建指针return std::shared_ptr<char>(array, ArrayDeleter<char>());