![](/img/trans.png)
[英]c++ template function error: variable or field 'swapAdjacent' declared void
[英]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;
}
您應該在每個模板函數參數之前添加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
推斷出key
或val
。
其他答案告訴您如何更正定義,但是在使用它時必須指定類型參數。
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.