这是代码:
#include <vector>
#include <algorithm>
#include <string>
#include <map>
#include <iostream>
using namespace std;
map<string, int> g_map;
void read_item(const pair<string, int>& p) {
g_map[p.first] += p.second;
}
void myprint(std::pair<const string, int> ci) {
cout << "first : " << ci.first << "seconde : " << ci.second << endl;
}
void myprint(int ci) {
cout << ci << endl;
}
int main()
{
string a = string("nail");
string b = string("hammer");
read_item(make_pair(a, 100));
read_item(make_pair(b, 2));
read_item(make_pair(b, 10));
read_item(make_pair(a, 200));
std::for_each(g_map.begin(), g_map.end(), myprint); // can't find the matching function here
vector<int> vec;
vec.push_back(3);
vec.push_back(3);
std::for_each(vec.begin(), vec.end(), myprint); // and here
return 0;
}
我重载了函数myprint
,我认为它应该正常工作,但事实并非如此。当我将第一个myprint
更改为myprint1
而第二个更改为myprint2
时,它可以正常工作。任何身体都可以帮忙?编译错误是:
funcTemOverload.cpp: In function 'int main()':
funcTemOverload.cpp:29:54: error: no matching function for call to 'for_each(std::map<std::basic_string<char>, int>::iterator, std::map<std::basic_string<char>, int>::iterator, <unresolved overloaded function type>)'
funcTemOverload.cpp:29:54: note: candidate is:
In file included from d:\mingw\bin\../lib/gcc/x86_64-w64-mingw32/4.7.2/include/c++/algorithm:63:0,
from funcTemOverload.cpp:2:
d:\mingw\bin\../lib/gcc/x86_64-w64-mingw32/4.7.2/include/c++/bits/stl_algo.h:4436:5: note: template<class _IIter, class _Funct> _Funct std::for_each(_IIter, _IIter, _Funct)
d:\mingw\bin\../lib/gcc/x86_64-w64-mingw32/4.7.2/include/c++/bits/stl_algo.h:4436:5: note: template argument deduction/substitution failed:
funcTemOverload.cpp:29:54: note: couldn't deduce template parameter '_Funct'
funcTemOverload.cpp:35:50: error: no matching function for call to 'for_each(std::vector<int>::iterator, std::vector<int>::iterator, <unresolved overloaded function type>)'
funcTemOverload.cpp:35:50: note: candidate is:
In file included from d:\mingw\bin\../lib/gcc/x86_64-w64-mingw32/4.7.2/include/c++/algorithm:63:0,
from funcTemOverload.cpp:2:
d:\mingw\bin\../lib/gcc/x86_64-w64-mingw32/4.7.2/include/c++/bits/stl_algo.h:4436:5: note: template<class _IIter, class _Funct> _Funct std::for_each(_IIter, _IIter, _Funct)
d:\mingw\bin\../lib/gcc/x86_64-w64-mingw32/4.7.2/include/c++/bits/stl_algo.h:4436:5: note: template argument deduction/substitution failed:
funcTemOverload.cpp:35:50: note: couldn't deduce template parameter '_Funct'
答案 0 :(得分:6)
根据要求,原始代码失败的原因是UnaryFunction
std::for_each
模板参数仅用于“非推断上下文”,并且未明确指定。 [temp.deduct.type]/4
:
由于...如果模板参数仅在非推断的上下文中使用且未明确指定,则模板参数推断将失败。
UnaryFunction
, [temp.deduct.call]/6
被视为非推断的上下文
当P [UnaryFunction]是函数类型时,指向函数类型的指针或指向成员函数类型的指针...如果参数[myprint]是重载集(不包含函数模板),则尝试使用试验推论每个成员。如果仅对其中一个重载集成员进行推导成功,则该成员将用作推导的参数值。 如果对重载集的多个成员进行推导成功,则该参数将被视为非推断的上下文。
一种选择是添加强制转换:
std::for_each(
g_map.begin(), g_map.end(),
static_cast<void (*)(std::pair<const string, int>)>(myprint));
std::for_each(
vec.begin(), vec.end(),
static_cast<void (*)(int)>(myprint));
另一种选择是使myprint
成为一个函数对象,以便在std::for_each
内发生重载解析:
struct myprint {
void operator()(std::pair<const string, int> ci) const {
cout << "first : " << ci.first << "seconde : " << ci.second << endl;
}
void operator()(int ci) const {
cout << ci << endl;
}
};
std::for_each(g_map.begin(), g_map.end(), myprint());
std::for_each(vec.begin(), vec.end(), myprint());