0

STL で使用する C++ カスタム アロケータを作成しています。次のコードをクラス定義に入れると、コンパイルされます。

#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

4

2 に答える 2

3

typenameの前に置く必要がありMyAlloc<T>::pointerます。の型は にMyAlloc<T>依存するため、コンパイラはが typedef であるか、メンバー変数または関数であるかをT認識しません。pointerを書かない場合typename、コンパイラは後者を想定します。

于 2010-02-03T06:41:55.390 に答える
3

テンプレートは常に翻訳単位内で定義する必要があります。テンプレート機能を使用するには、テンプレートの定義を別の .cpp ファイルではなく、ヘッダー ファイルに入れる必要があります。

于 2010-02-03T05:26:55.113 に答える