2009-06-26 14 views
0

は、Visual Studioで2009年C++のコンパイル・エラー

#include <iterator> 
#include <vector> 

template <class T1, class T2 > 
class A 
{ 
public: 

    typename std::vector<std::pair<T1,T2> >::iterator iterator; 
    std::pair<iterator, bool > foo(const std::pair<T1 ,T2> &value_in); 
}; 

をコンパイルエラーを与えている誰もがそれにいくつかの光を投げることができますか?ここにエラーがあります。あなたはtypedefを必要

error C2327: 'A<T1,T2>::iterator' : is not a type name, static, or enumerator 

答えて

9

をtypenameですませんこれは、変数(ないタイプ)であることをiteratorを宣言します。

typename std::vector<std::pair<T1,T2> >::iterator iterator; 

あなたはこのことですか?

typedef typename std::vector<std::pair<T1,T2> >::iterator iterator; 

詳しい情報:あなたはtypenameが何をするかについて興味があれば、dependentと非依存名の違いについてまでお読みください。型が特定のコンテナに密接に関連している場合、STLパターンは簡単にアクセスできるネストされた多くの型定義を使用するため、そのコンテナの型定義は便利です(V::value_type)。これには、コードが進化するにつれて変更を少なくするという追加の利点があります。別のアロケータ(ベクトルへの2番目のテンプレートパラメータ)を使用すると、1回の編集だけで済みます。

template<class T1, class T2> 
struct A { 
private: 
    // you may or may not want to expose these convenience types 
    typedef std::pair<T1, T2> P; 
    typedef std::vector<P> V; 

public: 
    typedef typename V::value_type value_type; 
    typedef typename V::iterator iterator; 
    std::pair<iterator, bool> foo(value_type const& value_in); 
}; 
0

は、

関連する問題