Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板参数_C++_Templates - Fatal编程技术网

C++ 模板参数

C++ 模板参数,c++,templates,C++,Templates,我想实现一个函数,它显示共享相同特征(但不一定在继承关系中)的不同模板类。 我在下面编写了以下代码,但编译器似乎无法将show()的调用与其模板相匹配。 它说: string_int-“模板映射的显式指定参数无效” string_string-“template-template参数与其对应的模板参数具有不同的模板参数”(但它确实正确匹配键和值) 你能帮忙吗 #include <iostream> #include <string> #include <map&g

我想实现一个函数,它显示共享相同特征(但不一定在继承关系中)的不同模板类。 我在下面编写了以下代码,但编译器似乎无法将show()的调用与其模板相匹配。 它说:

  • string_int-“模板映射的显式指定参数无效”
  • string_string-“template-template参数与其对应的模板参数具有不同的模板参数”(但它确实正确匹配键和值)
  • 你能帮忙吗

    #include <iostream>
    #include <string>
    
    #include <map>
    
    using namespace std;
    
    template <class KEY, class VALUE, template<class, class> class MAP>
    void show(string title, MAP<KEY, VALUE> &map)
    {
        cout << title << ":\n";
        for (auto &i: map) cout << i.first << " - " << i.second << endl;
        cout << endl;
    }
    
    int main(int, const char *[])
    {
        map<string, int> string_int;
        multimap<string, string> string_string;
        
        string_int["Mike"] = 50;
        string_int["Ann"] = 58;
        string_int["John"] = 39;
        string_int["Louise"] = 37;
        show<string, int, map<string, int>>("string_int", string_int);
    
        string_string.insert({ "Mike", "Self" });
        string_string.insert({ "Ann", "Spouse" });
        string_string.insert({ "John", "Friend" });
        string_string.insert({ "John", "Co-worker" });
        string_string.insert({ "Louise", "Friend" });
        string_string.insert({ "Louise", "Bridge partner" });
        show("string_string", string_string);
    
        return 0;
    }
    
    #包括
    #包括
    #包括
    使用名称空间std;
    样板
    无效显示(字符串标题、地图和地图)
    {
    
    cout您在
    show
    中的模板参数被限制为接受正好有两个模板参数的类模板。但是,
    std::map
    有两个以上的模板参数,因此推断失败

    可以通过使模板参数的模板参数可变来解决此问题:

    template <class KEY, class VALUE, template<class ...> class MAP>
                                                  // ^^^ 
    void show(string title, MAP<KEY, VALUE> &map);
    
    但是,当您明确指定模板参数时:

    show<string, int, map<string, int>>("string_int", string_int);  // error
    

    这里有一个。

    您缺少默认模板参数请不要使用
    使用命名空间std;
    ,这是一个坏习惯,并且会导致许多非常令人惊讶的错误。
    show<string, int, map<string, int>>("string_int", string_int);  // error
    
    show<string, int, map>("string_int", string_int);   // ok