2012-01-27 7 views
3

マップの指定されたキーと値のペアを繰り返し処理し、関数のパラメータで指定されたキーが存在するかどうかを確認するテンプレート関数を作成しようとしています。イテレータが定義されていないという奇妙なコンパイラエラー

コード

template < class Key, class Value > 
bool CheckMapForExistingEntry(const std::map< Key, Value >& map, const std::string& key) 
{ 
    std::map< Key, Value >::iterator it = map.lower_bound(key); 
    bool keyExists = (it != map.end && !(map.key_comp() (key, it->first))); 
    if (keyExists) 
    { 
     return true; 
    } 
    return false; 
} 

しかし、何らかの理由で、私は私のコードはコンパイルされません理由を把握することができないように次のように

実装が見えます。

error: expected ';' before 'it' 
error: 'it' was not declared in this scope 

これまで私が遭遇したことがありますが、これは通常、私が間違いを犯したために見つけやすいものです。ここで何が起こっているのでしょうか?

template < class Key, class Value > 
bool CheckMapForExistingEntry(const std::map< Key, Value >& map, const std::string& key) 
{ 
    typename std::map< Key, Value >::iterator it = map.lower_bound(key); 
    bool keyExists = (it != map.end && !(map.key_comp() (key, it->first))); 
    if (keyExists) 
    { 
     return true; 
    } 
    return false; 
} 

This articleがかなり詳細に説明します。

+0

[テンプレートとタイプ名]キーワードをどこで、どこに入れなければならないのですか?(http://stackoverflow.com/questions/610245/where-and-why-do-i-haveテンプレート名と型名のキーワード) – Lambdageek

答えて

5

はかなり確信して、あなたはtypename修飾子を必要としています。

実際には、コンパイラは、潜在的にiteratorという名前static変数を含めることができKeyValueの特定の値に対するstd::map< Key, Value >の専門があるかもしれないことを知っています。実際にここでは型を参照していて、推定静的変数ではないことを保証するには、typename修飾子が必要です。

+0

@Hollandコードを実行する前に、もう少しクリーンアップを使用することができます。 http://ideone.com/lcsQB – Lambdageek

+0

良い点を参照してください。私は彼が報告した特定のエラーに対処しました。 – mwigdahl

+0

+1質問と回答。 typenameの使用を知らなかった。 – patros

関連する問題