特定のクラスにメモリを割り当て、そのコンストラクターを呼び出すテンプレート関数があります。例えば:
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 つの引数を持つバージョンを選択する必要があります。テンプレートがどの関数を選択すればよいかわからないようです。
どうしてこれなの?
ありがとう