簡體   English   中英

具有std :: map的模板函數給出錯誤:變量或字段聲明為空

[英]Template function with std::map gives error: variable or field declared void

嘗試創建引用std :: map元素的模板函數,出現此錯誤。 我知道地圖有四個模板參數,但是兩個具有默認值,無法理解我該怎么做。

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”聲明為無效
  • 錯誤:“開始”之前應為“)”
  • 錯誤:“開始”之前應為“)”

您應該在每個模板函數參數之前添加typename關鍵字:

template<typename key, typename val> 
void arr_out (typename std::map<key, val>::iterator begin, 
              typename std::map<key, val>::iterator end)

在迭代器之前添加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;
}

模板推導規則不允許您從std::map<key, val>::iterator推斷出keyval

其他答案告訴您如何更正定義,但是在使用它時必須指定類型參數。

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;
}

為了使代碼有效,您必須添加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());

簡化呼叫站點的另一種方法是:

template <typename It>
void arr_out (It begin, It end);

或與一些SFINAE:

template <typename It>
auto arr_out (It begin, It end)
-> decltype(void(std::cout << (*begin).first << (*begin).second));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM