尝试创建模板函数什么cout std :: map元素,得到这个错误。我知道地图有四个模板参数,但有两个有defaut值,无法理解我必须做什么。
template<typename key, typename val> void arr_out (std::map<key, val>::iterator begin, std::map<key, val>::iterator end)
{
std::cout << "map: " << std::endl;
while(begin != end)
{
std::cout << (*begin).first << ": " << (*begin).second << std::endl ;
begin++;
}
std::cout << std::endl;
}
答案 0 :(得分:4)
您应该在每个模板函数参数之前添加typename关键字:
template<typename key, typename val>
void arr_out (typename std::map<key, val>::iterator begin,
typename std::map<key, val>::iterator end)
答案 1 :(得分:1)
在迭代器之前添加typename,它表示其嵌套值类型为模板。
template<typename key, typename val>
void arr_out(typename std::map<key, val>::iterator begin, typename std::map<key, val>::iterator end)
{
std::cout << "map: " << std::endl;
while(begin != end)
{
std::cout << (*begin).first << ": " << (*begin).second << std::endl ;
begin++;
}
std::cout << std::endl;
}
答案 2 :(得分:1)
模板扣除规则不允许您从key
推断val
或std::map<key, val>::iterator
。
其他答案告诉您如何更正定义,但您必须在使用时指定类型参数。
int main()
{
std::map<int, std::string> m;
// arr_out(m.begin(), m.end()); // errors relating to template argument deduction
arr_out<int, std::string>(m.begin(), m.end()); // Ok
return 0;
}
答案 3 :(得分:1)
要使代码有效,您必须添加thymeleaf-02-web
,
typename
并且由于参数不可推导,请将其命名为:
template<typename key, typename val>
void arr_out (typename std::map<key, val>::iterator begin,
typename std::map<key, val>::iterator end);
简化呼叫站点的另一种方法是:
std::map<Key, Value> m;
arr_out<Key, Value>(m.begin(), m.end());
或与某些SFINAE:
template <typename It>
void arr_out (It begin, It end);