如何重写模板化函数来处理类型推导

时间:2015-06-15 03:03:51

标签: 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..." << "\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;从一开始?

3 个答案:

答案 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=intT=string

从第二个参数中,它推导出T=int

所以它告诉你它有冲突。