Как определить шаблонную функцию, которая берет карту и лямбду для поиска пары карт по значению? - PullRequest
0 голосов
/ 04 мая 2020

В настоящее время у меня есть следующее:

std::find_if(mmap.begin(), mmap.end(),
                                    [streamShm](const std::pair<int, StreamMapContainer> pair) {
                                        return pair.second.pcktRefShm->id() == streamShm->id();
                                    });

, и я хочу преобразовать это в шаблонную функцию, что-то вроде этого (. cpp file):

template<template <typename...> class Map, typename K, typename T, typename Lambda>
typename Map<K, T>::const_iterator findMapPairByValue(typename const Map<K, T> &map, const Lambda &lambda) {
    return std::find_if(map.begin(), map.end(), lambda);
}

тогда я могу вызвать

findMapPairByValue(mmap, [streamShm](const std::pair<int, StreamMapContainer> pair) {
    return pair.second.pcktRefShm->id() == streamShm->id();
});

Я объявил функцию как extern в моем заголовочном файле:

template<template <typename...> class Map, typename K, typename T, typename Lambda>
extern typename Map<K, T>::const_iterator findMapPairByValue(typename const Map<K, T> &map, const Lambda &lambda);

Но функция выше не компилируется:

warning: 'findMapPairByValue' initialized and declared 'extern'
   31 | extern typename Map<K, T>::const_iterator findMapPairByValue(typename const Map<K, T> &map, const Lambda &lambda);
      |                                           ^~~~~~~~~~~~~~~~~~
/.hpp:31:71: error: expected nested-name-specifier before 'const'
   31 | extern typename Map<K, T>::const_iterator findMapPairByValue(typename const Map<K, T> &map, const Lambda &lambda);
      |                                                                       ^~~~~
/.hpp:31:71: error: expected '(' before 'const'
   31 | extern typename Map<K, T>::const_iterator findMapPairByValue(typename const Map<K, T> &map, const Lambda &lambda);
      |                                                                       ^~~~~
      |                                                                       (
/.hpp:31:85: error: expected primary-expression before '>' token
   31 | extern typename Map<K, T>::const_iterator findMapPairByValue(typename const Map<K, T> &map, const Lambda &lambda);
      |                                                                                     ^
/.hpp:31:88: error: 'map' was not declared in this scope; did you mean 'std::map'?
   31 | extern typename Map<K, T>::const_iterator findMapPairByValue(typename const Map<K, T> &map, const Lambda &lambda);
      |                                                                                        ^~~
      |                                                                                        std::map

1 Ответ

2 голосов
/ 04 мая 2020

Большая часть тела функции правильная. Вы просто неправильно использовали typename в списке параметров:

template<template <typename...> class Map, typename K, typename T, typename Lambda>
typename Map<K, T>::const_iterator findMapPairByValue(const Map<K, T> &map, const Lambda &lambda) {
    return std::find_if(map.begin(), map.end(), lambda);
}

Кроме того, стоит отметить, что определение функции шаблона должно быть помещено в заголовочный файл, а не в *. cpp file

...