2012-02-21 12 views
1

私は、内部にポインタのstd :: mapを持つ構造体を持っています。その後、ポインタマップの配列添字演算子

template <class T> 
struct Foo 
{ 
    std::map<std::string, T*> f; 
    T& operator[](std::string s) 
    { 
     return *f[s]; 
    } 
} 

とこのようにそれを使用します:

Foo<Bar> f; 
f["key"] = new Bar(); 

それが書かれている方法、それはプログラムをクラッシュ私は、次のやろうとしています。私もこのようにしてみました:

T* operator[](std::string s) 
{ 
    return f[s]; 
} 

しかし、それはコンパイルされません。 f["key"] = new Bar()行には"lvalue required as left operand of assignment"と表示されています。

私はポインタを返そうとしているのでポインタが格納されているので、それは簡単だと思っていました。私のコードで何が間違っていますか?

答えて

5

これを行うための正しい方法は次のとおりです。

T*& operator[](std::string s) 
{ 
    return f[s]; 
} 

f["key"] = new Bar()のようにそれを呼び出します。

EDIT:あなたはどこのことができますconst参照することにより、非基本タイプを渡して起動する必要があります。

T*& operator[](const std::string& s) 
+0

なぜ 'のstd ::文字列S'?どうして 'std :: string const&s'ですか? – Nawaz

+0

@Nawazはそれを捕まえていませんでした。 –

+0

operator [] – Ajay

関連する問題