2012-04-25 15 views
1

エラー:C++のテンプレート、私はテンプレートクラスをコンパイルしようとすると、私は次のエラー得た使用のstdイテレータ

C.cpp: In member function 'void PeriodContainerAdvanced<T>::add()': 
C.cpp:133: error: type/value mismatch at argument 1 in template parameter list for 'template<class _T1, class _T2> struct std::pair' 
C.cpp:133: error: expected a type, got 'std::map<int,T,std::less<int>,std::allocator<std::pair<const int, T> > >::iterator' 
C.cpp:133: error: invalid type in declaration before ';' token 

Chのファイルでクラス:(簡体字)

template <class T> 
class PeriodContainerAdvanced 
{ 
[skip] 
    void add(); 
[skip] 
} 

C.cppを(簡体字):

template <class T> 
void PeriodContainerAdvanced<T>::add() 
{ 
[skip] 
    std::pair<std::map< time_t, T >::iterator, bool> ret; // line 133 ! 
[skip] 
} 

そして、他の機能で同様のエラー

を定義しようとしていますこのラインコンパイラ後
std::map< time_t, T >::iterator it, it_start, it_end; // line 153 

は言う:

C.cpp:153: error: expected `;' before 'it' 
C.cpp:166: error: 'it_start' was not declared in this scope 

それを修正する方法は?依存名だおかげ

答えて

9

は、あなたのようにそれを宣言する必要があります後にリンカエラーを回避するために、また

std::pair<typename std::map< time_t, T >::iterator, bool> ret; 

、あなたはそれを使用するすべての翻訳単位に見えるファイルにテンプレートの実装を移動する必要がありますtemplate - テンプレートクラスを定義するヘッダのように。

+0

ありがとう、その名前の – abrahab

6

最初に、add()の実装をヘッダーファイルまたはヘッダーに含まれるファイルに配置する必要があります。コンパイラは、与えられたTのテンプレートをインスタンス化するためにコードを見る必要があります。

第2に、あなたが引用したエラーの原因は、タイプについて話していることをコンパイラに伝えるためにtypenameを追加する必要があります。 std::map< time_t, T >::iteratorは値として解釈できます。

+0

でコンパイルすると、そのコンパイルには「最初の」ステップはなく、2番目のステップだけがコンパイルされます。ありがとう。 void add()のようにヘッダファイルで定義された追加。 (最初のメッセージを見てください)そしてC.cpp – abrahab

+0

@abrahabで実装されています。それはあなたのビルドシステムが何か魔法をしていない限り、まったく変です。または、実行可能ファイルでまだ使用しようとしていないかもしれません。 – juanchopanza

+0

がすでに使用されています。 gccはクラス関数の実装が次のようになっていることを知っているようです:テンプレート void PeriodContainerAdvanced :: add(){..} C.cpp。面白い。そのほかのすべての機能は、分離された.cppファイルで機能します... – abrahab

関連する問題