C++ 如何重新编写模板函数来处理类型推断

C++ 如何重新编写模板函数来处理类型推断,c++,templates,c++11,C++,Templates,C++11,因此,我对地图容器具有以下搜索功能: 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..." <<

因此,我对地图容器具有以下搜索功能:

    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";
                }
            }
        }
    }
模板
void searchInMapByKey(标准::映射映射,T键值)
{
if(Map.empty())
{

std::cout您正在使用
map
mapped\u type
T
作为键值,您应该使用
key\u type
,因此将函数声明更改为:

template <typename Key, typename T>
void searchInMapByKey(std::map<Key,T> Map, Key keyValue)
模板
void searchInMapByKey(标准::映射映射,键值)

您正在使用
map
mapped\u type
T
作为键值,您应该使用
key\u type
,因此将函数声明更改为:

template <typename Key, typename T>
void searchInMapByKey(std::map<Key,T> Map, Key keyValue)
模板
void searchInMapByKey(标准::映射映射,键值)

您告诉编译器,
searchInMapByKey
函数有两个参数:一个是
map
,另一个是
T

对于呼叫,您将传递
map
int

从第一个参数推断出
Key=int
T=string

从第二个参数推断出
T=int


因此它告诉您它有冲突。

您告诉编译器函数
searchInMapByKey
有两个参数:一个
map
,一个
T

对于呼叫,您将传递
map
int

从第一个参数推断出
Key=int
T=string

从第二个参数推断出
T=int


因此,它告诉您它存在冲突。

问题在于映射类型和键类型之间不匹配。 但我不会通过更正参数
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";
        }
    }
}
模板
void searchInMapByKey(常量映射类型&映射,键类型键){
if(Map.empty()){

std::cout问题在于映射类型和键类型之间不匹配。 但我不会通过更正参数
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";
        }
    }
}
模板
void searchInMapByKey(常量映射类型&映射,键类型键){
if(Map.empty()){

std::cout什么阻止了你使用
std::map:find()
在你的地图内搜索?第二个参数应该是
Key
,但是
T
。那么为什么你不能用
std::set
代替
std::map
?什么阻止了你使用
std::map:find()
在地图内部搜索?第二个参数应该是
Key
,但是
T
。那么为什么不能使用
std::set
代替
std::map
?正如@0x499602D2所建议的,我怀疑参数
keyvalue
应该是
Key
类型。正如@0x499602D2所建议的,我怀疑参数
keyvalue
应该是
Key
类型。非常感谢!这正是我想要的。您还为我展示了编写其余代码的更好方法!非常感谢!这正是我想要的。您也为我展示了编写其余代码的更好方法!