Частичная специализация шаблона функции C++

В основном я реализую свою собственную функцию распределения памяти Malloc(), которая

void Malloc(size_t size);

Теперь я хочу реализовать свои собственные функции New и NewArray, я объявляю эти две функции следующим образом:

// template 
  template <class T>
  T* New(void);
  template <class T>
  T* NewArray(unsigned int num);

И реализации:

template <class T>
T* MemPool::New<T>()
{
  return (T *)Malloc(sizeof(T));
}

template <class T>
T* MemPool::NewArray<T>(unsigned int num)
{
  if(num < 0)
    return NULL;
  return (T*) Malloc(sizeof(T) * num);
}

Но компиляция терпит неудачу с этим:

MP.cpp:482:20: error: function template partial specialization ‘New<T>’ is not allowed
 T* MemPool::New<T>()
                    ^
MP.cpp:488:41: error: function template partial specialization ‘NewArray<T>’ is not allowed
 T* MemPool::NewArray<T>(unsigned int num)

person Harvey Dent    schedule 30.01.2015    source источник
comment
if(num < 0) это невозможно.   -  person Neil Kirk    schedule 30.01.2015
comment
^ Теперь, если кто-то напишет NewArray(-1), num будет равно UINT_MAX.   -  person emlai    schedule 30.01.2015


Ответы (1)


У вас есть лишний <T> здесь:

template <class T>
T* MemPool::New<T>()
//             ^^^

Должно быть просто:

template <class T>
T* MemPool::New()

И то же самое для NewArray.

person Barry    schedule 30.01.2015
comment
Спасибо! Компиляция прошла успешно, но если я использую эти две функции, такие как int p2 =mp-›New‹int›(); char *p3 = mp-›NewArray‹char›(10); У него есть еще одна проблема компиляции: неопределенная ссылка на `int MemPool::New‹int›()' - person Harvey Dent; 30.01.2015
comment
@MartinGGWW Потому что шаблоны должны быть определены в заголовке. - person Barry; 30.01.2015
comment
это работает после того, как я переместил их в заголовочный файл. Спасибо за совет и за ссылку тоже! - person Harvey Dent; 30.01.2015