带有std :: map的模板函数给出了错误:变量或字段声明为void

时间:2018-04-19 12:05:54

标签: c++

尝试创建模板函数什么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;
}
  • 错误:变量或字段'arr_out'声明为void
  • 错误:预期')'在'开始'之前
  • 错误:预期')'在'开始'之前

4 个答案:

答案 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推断valstd::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);