C++ 映射的std::for_each()给出无效的初始化错误

C++ 映射的std::for_each()给出无效的初始化错误,c++,c++11,stl,C++,C++11,Stl,我对STL比较陌生,尤其是算法库。 我试图使用std::for_each()函数迭代std::multimap,其中键和值的类型都是std::string,并执行一些任务 这是我的std::multimap: std::multimap<std::string, std::string> myMap; for (int i = 0; i < 5; i++) { myMap.insert(std::make_pair("key", "value")); } ask()函

我对STL比较陌生,尤其是算法库。 我试图使用
std::for_each()
函数迭代
std::multimap
,其中键和值的类型都是
std::string
,并执行一些任务

这是我的
std::multimap

std::multimap<std::string, std::string> myMap;
for (int i = 0; i < 5; i++) {
    myMap.insert(std::make_pair("key", "value"));
}
ask()
函数定义如下:

void ask(std::pair<std::string, std::string>& entry) {
    // do something...
}
void ask(std::pair&entry){
//做点什么。。。
}
程序给了我以下错误:

错误:类型的引用初始化无效 来自类型表达式的'std::_cxx11::basic_string&' 'std::pair, std::\uuuCXX11::基本字符串>'

我知道,问题出在
for_each()
函数上,我认为这是因为
ask()
函数的参数不正确。
但据我所知,
std::multimap
的每个条目都表示为一个
std::pair
,因此
ask()
函数不应该将一个
std::pair
对象作为其参数吗?

std::multimap
的元素类型是
std::pair
。注意
const
用于
std::multimap
的默认分配器是

std::allocator<std::pair<const Key, T>
其中as
ask()
需要参数作为对类型的引用

std::pair<std::string, std::string>

您可以直接询问,而不是猜测地图的元素类型

void ask(std::multimap<std::string, std::string>::reference entry) {
    // do something...
}
void ask(std::multimap::reference条目){
//做点什么。。。
}
为这个映射类型创建一个类型别名可能是个好主意,这样您就不必重复它了

using myMap_t = std::multimap<std::string, std::string>;

void ask(myMap_t::reference entry) {
    // do something...
}

int main() {
    myMap_t myMap;
    for (int i = 0; i < 5; i++) {
        myMap.insert(myMap_t::value_type("key", "value"));
    }

    std::for_each(myMap.begin(), myMap.end(), ask);
}
使用myMap\u t=std::multimap;
void ask(myMap\u t::引用条目){
//做点什么。。。
}
int main(){
myMap\u t myMap;
对于(int i=0;i<5;i++){
insert(myMap_t::value_type(“key”、“value”);
}
std::for_each(myMap.begin(),myMap.end(),ask);
}

我已经试过了,但没用。它给出了完全相同的结果error@HidayetRzayev编辑:对不起,我忘了在我的函数声明中添加常量,它工作得很好。谢谢大家!@ask()方法相当长,因此我决定通过编写一个单独的函数来保持代码的整洁。
void ask(std::pair<const std::string, std::string>& entry)
{
}
void ask(std::multimap<std::string, std::string>::reference entry) {
    // do something...
}
using myMap_t = std::multimap<std::string, std::string>;

void ask(myMap_t::reference entry) {
    // do something...
}

int main() {
    myMap_t myMap;
    for (int i = 0; i < 5; i++) {
        myMap.insert(myMap_t::value_type("key", "value"));
    }

    std::for_each(myMap.begin(), myMap.end(), ask);
}