2012-05-03 9 views
0

私は専門mapの定義に助けが必要なので、コンパイルのために特殊なmap :: iteratorを得ることはできません。std :: mapクラスのイテレータを定義する方法

find()コールのためにこのイテレータをどのように定義する必要がありますか?

コード:

// My case-insensitive-less functor, which has historically worked fine for me: 
struct ci_less : std::binary_function<std::string, std::string, bool> 
{ 
    // case-independent (ci) compare_less binary function 
    struct nocase_compare : public std::binary_function<unsigned char,unsigned char,bool> 
    { 
    bool operator() (const unsigned char& c1, const unsigned char& c2) const { 
     return tolower (c1) < tolower (c2); 
    } 
    }; 
    bool operator() (const std::string & s1, const std::string & s2) const { 
    return std::lexicographical_compare (s1.begin(), s1.end(), 
             s2.begin(), s2.end(), 
             nocase_compare()); // comparison 
    } 
}; 

//My offending code: 
template <class T> 
class CaseInsensitiveMap : public map<string, T, ci_less> 
{ 
public: 
// This one actually works, but it requires two "find()" calls. 
// I can't ethically call find twice. 
    const T* lookup(const T& key) const { 
    if (find(key) == map<string, T, ci_less>::end()) return 0; 
    else            return &find(key)->first; 
    } 
// This one complains with errors shown below. 
    T* lookup(const T& key) { 
    CaseInsensitiveMap<T>::iterator itr = find(key); 
    if (itr == map<string, T, ci_less>::end()) return 0; 
    else    return itr->second; 
    } 
}; 

エラー:あなたはSTLコンテナを継承してはならない、とにかく

typename CaseInsensitiveMap<T>::iterator itr = find(key); 

In member function 'T* CaseInsensitiveMap<T>::lookup(const T&)' :
    error: expected ';' before 'itr'
    error: 'itr' was not declared in this scope

+1

私は 'のstd :: map'がから継承されることを意図したとは思いません。 – chris

+2

今後、外部サイトにリンクするのではなく、コードとエラーをインラインで投稿してください。 – ildjarn

答えて

4

があなたの変数の型にtypenameキーワードを追加します。なぜあなたはそれをしてはならないのかを読むhere

編集:あなたが実装しようとしているすべてのケースinsenstitiveマップであるので、あなたは自分自身の比較オブジェクトを提供する、std::mapを継承せずに、それをこのように実装することができます。

#include <iostream> 
#include <map> 
#include <string> 

using namespace std; 

struct nocase_compare { 
    bool operator() (const unsigned char& c1, const unsigned char& c2) const { 
     return tolower (c1) < tolower (c2); 
    } 
}; 

struct map_comparer { 
    bool operator() (const std::string & s1, const std::string & s2) const { 
    return std::lexicographical_compare (s1.begin(), s1.end(), 
             s2.begin(), s2.end(), 
             nocase_compare()); // comparison 
    } 
}; 

template<class T> 
struct CaseInsensitiveMap { 
    typedef std::map<std::string, T, map_comparer> type; 
}; 

int main() { 
    CaseInsensitiveMap<int>::type my_map; 
    my_map["foo"] = 12; 
    std::cout << my_map["FoO"] << "\n"; 
    my_map["FOO"] = 100; 
    std::cout << my_map["fOo"] << "\n"; 
} 

この出力:

12 
100 
0

typename CaseInsensitiveMap :: iterator itr = find(key);

でのライン#31

関連する問題