1

テンプレート クラスをコンパイルしようとすると、次のエラーが発生しました。

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

修正方法は?ありがとう

4

2 に答える 2

9

これは従属名です。次のように宣言する必要があります。

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

また、後のリンカー エラーを回避するために、テンプレートの実装を、そのテンプレートを使用するすべての翻訳単位に表示されるファイル (テンプレート クラスを定義するヘッダーなど) に移動する必要があります。

于 2012-04-25T14:57:41.400 に答える
6

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

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

template <class T>
class PeriodContainerAdvanced {
  void add () {
    std::pair<typename std::map< time_t, T >::iterator, bool> ret;
    ....         ^
  }
};
于 2012-04-25T14:59:23.287 に答える