我有一个带有自定义比较器的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 :(得分:6)
您只能在声明后使用名称,并且只有在其范围内。您的比较器类型的范围是main
,因此您只能在该函数中使用它。将定义从main
移出到全局命名空间(如果您愿意,可以移动到另一个命名空间中),以使其在其他函数中可用。
或者,您可以将另一个函数作为模板,因此它可以使用任何地图类型:
template <typename Map>
void funcOut(Map const & myMap) {
// your code here
}
答案 1 :(得分:4)
使用模板,因为我是一个懒惰的c ++开发人员(我不需要担心很多细节......)我会这么做..
template <typename MapType>
void funcOut(MapType& myMap)
{
for (auto& p : myMap)
{
std::cout << p.first << " => " << p.second << std::endl;
}
}