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

とは異なりunique_ptr、デリータはクラス テンプレート パラメータではありません。デリータは使用回数とともに別のオブジェクトに格納されるため、型消去を使用してポインタ オブジェクト自体をデリータ型に依存しないようにすることができます。

適切なファンクター型でポインターを初期化できるコンストラクター テンプレートがあります。だからあなたの機能は単純です

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

そして、彼らは適切なデリータでポインタを作成します

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