2016-08-10 101 views
-4

下面的代碼拋出2個的編譯器錯誤在VS 2013:語法錯誤識別符 '遊標'

  1. 模板函數定義拋出

    錯誤C2061:語法錯誤:識別符 'iterator'

  2. 該模板功能的專業化拋出

    錯誤[R C2912:明確的專業化「double getFillIn<double,double>(fillInOptions,double,std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>,inputLoader *,va_list)」不是一個函數模板

任何人都可以請解釋原因的特?我很確定第二個錯誤只是第一個錯誤的結果,但我不明白爲什麼它不能找出iterator標識符。

#include <map> 

template <typename T> class table { 
}; 

template <typename S, typename T> 
void f(S s, std::map<S, table<T>*>::iterator it); 
+2

嘗試'typename map *> :: iterator'。 – songyuanyao

+0

我錯了,但'template class lookupTable ;'在完全定義'lookupTable'之前'會咬你。關閉主題:交換機中的默認情況不會返回任何內容。對於編譯器警告以及如果一個無效或新的'opt'偷偷進入有點困難的調試很好。 – user4581301

回答

1

因爲編譯器還不知道的std::map<S, table<T>*>的類型,它可以知道的還以爲std::map<S, table<T>*>::iterator是一種類型(這可能是一個成員)。你需要告訴它它將是一個類型:

template <typename S, typename T> 
void f(S s, typename std::map<S, table<T>*>::iterator it); 
+0

修復了這兩個錯誤 - 非常感謝! – GodLovesUGaius

相關問題