2015-04-15 4 views
1

У меня есть карта STL с пользовательским компаратором, который я хочу передать функции, но функция не распознает пользовательский компаратор.Передача карты с пользовательским компаратором для функции

Попытка доступа к карте в рамках основной функции работает.

Я перечислил обе попытки в моем коде.

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

// Error: cmpByStringLength is not recognized (both times) 
void funcOut(std::map<std::string, int, cmpByStringLength> myMap) 
{ 
    for (std::map<std::string, int, cmpByStringLength>::iterator it = myMap.begin(); it != myMap.end(); ++it) 
    { 
    std::cout << it->first << " => " << it->second << std::endl; 
    } 
} 

int main() 
{ 
    // Reverse sort by length 
    struct cmpByStringLength { 
    bool operator()(const std::string& a, const std::string& b) const { 
     return a.length() > b.length(); 
    } 
    }; 

    std::map<std::string, int, cmpByStringLength> myMap; 
    myMap.emplace("String 1", 5); 
    myMap.emplace("String 123", 10); 

    funcOut(myMap); 

    // Working 
    for (std::map<std::string, int, cmpByStringLength>::iterator it = myMap.begin(); it != myMap.end(); ++it) 
    { 
    std::cout << it->first << " => " << it->second << std::endl; 
    } 
    return 0; 
} 
+0

вам нужно поставить 'определение cmpByStringLength' на вершине функции funcOut – billz

+0

Перемещение-структуры в верхнем файла над функцией. Как и все остальное, вам нужно хотя бы объявление (и в этом случае определение) для вещей, которые будут использоваться. – Borgleader

+0

Правильно, теперь это работает! Благодарю. –

ответ

5

Вы можете только используйте имя после его объявления и только в том случае, если оно находится в области видимости. Тип вашего компаратора находится в пределах main, поэтому вы можете использовать его только в этой функции. Переместите определение из main в глобальное пространство имен (или в другое пространство имен, если хотите), чтобы сделать его доступным для других функций.

В качестве альтернативы, вы могли бы сделать другую функцию шаблона, поэтому он может работать с любым типом карты:

template <typename Map> 
void funcOut(Map const & myMap) { 
    // your code here 
} 
+0

А я пробовал это, но это дало мне некоторую ошибку перегрузки, но переместило ее на самую верхнюю часть, над функцией работала! –

+0

@CGuy: Да, вы должны объявить его перед использованием, как я уже сказал. –

+0

Где я могу разместить объявление карты и пользовательский компаратор, если я должен использовать его между несколькими файлами и методами классов? Сделать отдельный класс? –

4

Используйте шаблон, потому что я ленивый C++ разработчик (мне не нужно беспокоиться о многих деталях ...) Я бы ..

template <typename MapType> 
void funcOut(MapType& myMap) 
{ 
    for (auto& p : myMap) 
    { 
    std::cout << p.first << " => " << p.second << std::endl; 
    } 
} 
Смежные вопросы