Ошибка компиляции распределителя памяти в C ++ STL - PullRequest
0 голосов
/ 03 февраля 2010

Я пишу пользовательский распределитель C ++ для использования с STL. Когда я помещаю следующий код в определение класса, он компилируется:

#include "MyAlloc.hpp"

#if 1
template <typename T>
typename MyAlloc<T>::pointer
MyAlloc<T>::allocate(size_type n, MyAlloc<void>::const_pointer p) {
  void *ptr = getMemory(n*sizeof(T));

  typename MyAlloc<T>::pointer tptr = static_cast<MyAlloc<T>::pointer>(ptr);
  return tptr;
}
#endif

Но когда я помещаю его в отдельный файл .cpp, я получаю следующую ошибку. Что я делаю неправильно? Ошибка в строке static_cast.

g++ -c MyAlloc.cpp
MyAlloc.cpp: In member function ‘typename MyAlloc<T>::pointer MyAlloc<T>::allocate(size_t, const void*)’:
MyAlloc.cpp:9: error: expected type-specifier
MyAlloc.cpp:9: error: expected `>'
MyAlloc.cpp:9: error: expected `('
MyAlloc.cpp:9: error: expected `)' before ‘;’ token
make: *** [MyAlloc.o] Error 1

PT

Ответы [ 2 ]

3 голосов
/ 03 февраля 2010

Вам нужно поставить typename перед MyAlloc<T>::pointer. Поскольку тип MyAlloc<T> зависит от T, компилятор не знает, является ли pointer typedef, переменной-членом или функцией. Если вы не пишете typename, то компилятор принимает последнее.

3 голосов
/ 03 февраля 2010

Шаблоны всегда должны быть определены в единице перевода. Чтобы использовать функцию шаблона, определение шаблона должно находиться в файле заголовка, а не в отдельном файле .cpp.

...