Как создать шаблон контейнера (например, std :: map)? - PullRequest
2 голосов
/ 17 марта 2011

Итак, у меня был простой рабочий код, например

template <typename T, typename VALUE>
VALUE mapAt(T key)
{
    std::map<T, VALUE>::const_iterator item_i(MyMap.find(key))
                                      , end_i(MyMap.end());
    if (item_i == end_i)
    {
        throw std::exception("No such key!");
    }

    return (*item_i).second;
}

Вопрос : возможно ли создать новую функцию template без использования std::map, но с использованием других контейнеров (например, std::map, std::multimap, ...) примерно так:

template <class Container, typename T, typename VALUE>
VALUE mapAt(Container& MyMap, T key)
{
    Container<T, VALUE>::const_iterator item_i(MyMap.find(key))
                                       , end_i(MyMap.end());
    /* ... */
}

Проблема : когда я пытаюсь его использовать, например:

std::map<int, char> my_map;
char ch = mapAt<std::map<int, char>(), int, char>(my_map, 123); // C2664 error

компилятор выдает мне ошибку:

main.cpp (119): ошибка C2664: 'mapAt': невозможно преобразовать параметр 1 из 'std :: map <_Kty, _Ty>' в 'std :: map <_Kty, <em>Ty> ( _cdecl &)' 1>
с 1> [1>
_Kty = int, 1> _Ty = char 1>] 1> Нет пользовательских преобразований оператор, который может выполнять это преобразование или оператор нельзя назвать

1 Ответ

2 голосов
/ 17 марта 2011

Вы можете написать что-то вроде этого:

template <class Container>
typename Container::mapped_type mapAt(Container& MyMap, typename const Container::key_type& key)
{
    typename Container::const_iterator iter = MyMap.find(key);
    return iter->second;
}

int main()
{
    std::map<int, char> my_map;
    char ch = mapAt(my_map, 123); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...