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