Оператор индекса массива для карты указателей - PullRequest
1 голос
/ 21 февраля 2012

У меня есть структура с указателем 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".

Я ожидал, что это будет легко, поскольку я пытаюсь вернуть указатель и храню указатель.Что не так с моим кодом?

1 Ответ

5 голосов
/ 21 февраля 2012

Правильный способ сделать это:

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

и назовите это как f["key"] = new Bar().

РЕДАКТИРОВАТЬ: Вы должны начать передавать неосновные типы по константной ссылке, где вы можете:

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