所以,我有这个地图容器的搜索功能:
template <typename Key, typename T>
void searchInMapByKey(std::map<Key,T> Map, T keyValue)
{
if(Map.empty())
{
std::cout << "Map is empty, nothing to search for..." << "\n";
}
else
{
for(const auto & element : Map)
{
if(element.first==keyValue)
{
std::cout << keyValue << "matches a key value " << " in the map" << "\n";
}
}
}
}
我似乎遇到了推断类型问题,特别是这个错误:
candidate template ignored: deduced conflicting types for parameter 'T' ('std::__1::basic_string<char>' vs. 'int')
当我尝试使用以下代码进行测试时:
map<int,string> myMap;
myMap.emplace(1,string("a"));
myMap.emplace(2,string("b"));
myMap.emplace(3,string("c"));
searchInMapByKey(myMap,1);
因为编译器不知道与&#34; T&#34;,整数或字符串相关联的类型。
现在,我问了一个类似question的类似错误,并且能够通过使用C ++样式字符串解决问题。但是,我不想根据具体情况继续处理冲突类型的演绎错误,并且想知道我如何编写这个函数(使用模板)来帮助编译器更好地推断哪个类型应该与&相关联。 #34; T&#34;从一开始?
答案 0 :(得分:2)
问题是Map的类型和键类型之间不匹配。
但我不是通过更正参数std::map
参数的顺序来修复它,而是通过将定义更改为更通用。
template <typename MapType, typename KeyType>
void searchInMapByKey(const MapType & Map, KeyType key) {
if(Map.empty()) {
std::cout << "Map is empty, nothing to search for..." << "\n";
return;
}
for(const auto & element : Map) {
if(element.first==keyValue) {
std::cout << keyValue << "matches a key value " << " in the map" << "\n";
}
}
}
答案 1 :(得分:1)
您使用mapped_type
的{{1}},map
作为键值,您应该使用T
,因此请将函数声明更改为:< / p>
key_type
答案 2 :(得分:1)
您告诉编译器函数searchInMapByKey
有两个参数:map<Key, T>
和T
。
对于来电,您传递map<int, string>
和int
从第一个参数中,它推导出Key=int
和T=string
。
从第二个参数中,它推导出T=int
。
所以它告诉你它有冲突。