0

特定のクラスにメモリを割り当て、そのコンストラクターを呼び出すテンプレート関数があります。例えば:

template <class T, class arg0>
inline T* AllocateObject(arg0 a0) { return new (InternalAllocate(sizeof(T))) T(a0); }
template <class T, class arg0, class arg1>
inline T* AllocateObject(arg0 a0, arg1 a1) { return new (InternalAllocate(sizeof(T))) T(a0,a1); }

次のように、値またはポインターで何かを渡すと正常に機能します。

int myInt = 5;
int* myIntPointer = &myInt;

MyClass1* myCls1 = AllocateObject<MyClass1>(myInt);     // a class with int in its constructor
MyClass2* myCls2 = AllocateObject<MyClass2>(myIntPointer);    // a class with int ptr in its constructor

ただし、次のように参照で何かを渡そうとすると機能しません

int& myIntRef = myInt;

MyClass3* myCls3 = AllocateObject<MyClass3>(myIntRef, myIntRef);     // a class with two int ref in its constructor

それをしようとすると、次のようなエラーが発生します。

error C2893: Failed to specialize function template
error C2780: 'T *IMemoryAllocator::AllocateObject(arg0)' : expects 1 arguments - 2 provided

.. MyClass3 コンストラクターは 2 つの引数を受け入れますが、テンプレートは 2 つの引数を持つバージョンを選択する必要があります。テンプレートがどの関数を選択すればよいかわからないようです。

どうしてこれなの?

ありがとう

4

1 に答える 1

-1

std::remove_referenceテンプレートを試す。

template <class T, class arg0>
inline T* AllocateObject(arg0 a0) { return new (InternalAllocate(sizeof(T))) T(std::remove_reference<arg0>::type(a0)); }

または、より c++ な方法で以下を使用しstatic_castます。

template <class T, class arg0>
inline T* AllocateObject(arg0 a0) { return new (InternalAllocate(sizeof(T))) T(static_cast<std::remove_reference<arg0>::type>(a0)); }
于 2012-08-19T16:50:45.310 に答える