今天運行程序的時候遇到了下面這個bug
1> B1020.cpp 1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(371): error C2825: '_Iter': 當后面跟“::”時必須為類或命名空間 1> e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(584): 參見對正在編譯的類 模板 實例化“std::iterator_traits<_InIt>”的引用 1> with 1> [ 1> _InIt=int 1> ] 1> e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\algorithm(3155): 參見對正在編譯的函數 模板 實例化“void std::_Debug_range<_RanIt>(_InIt,_InIt,std::_Dbfile_t,std::_Dbline_t)”的引用 1> with 1> [ 1> _RanIt=int 1> , _InIt=int 1> ] 1> e:\c++\common\algorithmnote\algorithmnote\b1020.cpp(48): 參見對正在編譯的函數 模板 實例化“void std::sort<int,bool(__cdecl *)(mooncake,mooncake)>(_RanIt,_RanIt,_Pr)”的引用 1> with 1> [ 1> _RanIt=int 1> , _Pr=bool (__cdecl *)(mooncake,mooncake) 1> ] 1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(371): error C2039: “iterator_category”: 不是“`global namespace'”的成員 1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(371): error C2146: 語法錯誤: 缺少“;”(在標識符“iterator_category”的前面) 1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(371): error C2602: “std::iterator_traits<_InIt>::iterator_category”不是“std::iterator_traits<_InIt>”基類的成員 1> with 1> [ 1> _InIt=int 1> ] 1> e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(371) : 參見“std::iterator_traits<_InIt>::iterator_category”的聲明 1> with 1> [ 1> _InIt=int 1> ] 1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(371): error C2868: “std::iterator_traits<_InIt>::iterator_category”: 非法的 using 聲明語法;應輸入限定名 1> with 1> [ 1> _InIt=int 1> ] 1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(372): error C2825: '_Iter': 當后面跟“::”時必須為類或命名空間 1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(372): error C2039: “value_type”: 不是“`global namespace'”的成員 1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(372): error C2146: 語法錯誤: 缺少“;”(在標識符“value_type”的前面) 1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(372): error C2602: “std::iterator_traits<_InIt>::value_type”不是“std::iterator_traits<_InIt>”基類的成員 1> with 1> [ 1> _InIt=int 1> ] 1> e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(372) : 參見“std::iterator_traits<_InIt>::value_type”的聲明 1> with 1> [ 1> _InIt=int 1> ] 1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(372): error C2868: “std::iterator_traits<_InIt>::value_type”: 非法的 using 聲明語法;應輸入限定名 1> with 1> [ 1> _InIt=int 1> ] 1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(373): error C2825: '_Iter': 當后面跟“::”時必須為類或命名空間 1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(373): error C2039: “difference_type”: 不是“`global namespace'”的成員 1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(373): error C2146: 語法錯誤: 缺少“;”(在標識符“difference_type”的前面) 1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(373): error C2602: “std::iterator_traits<_InIt>::difference_type”不是“std::iterator_traits<_InIt>”基類的成員 1> with 1> [ 1> _InIt=int 1> ] 1> e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(373) : 參見“std::iterator_traits<_InIt>::difference_type”的聲明 1> with 1> [ 1> _InIt=int 1> ] 1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(373): error C2868: “std::iterator_traits<_InIt>::difference_type”: 非法的 using 聲明語法;應輸入限定名 1> with 1> [ 1> _InIt=int 1> ] 1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(375): error C2825: '_Iter': 當后面跟“::”時必須為類或命名空間 1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(375): error C2039: “pointer”: 不是“`global namespace'”的成員 1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(375): error C2146: 語法錯誤: 缺少“;”(在標識符“pointer”的前面) 1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(375): error C2602: “std::iterator_traits<_InIt>::pointer”不是“std::iterator_traits<_InIt>”基類的成員 1> with 1> [ 1> _InIt=int 1> ] 1> e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(375) : 參見“std::iterator_traits<_InIt>::pointer”的聲明 1> with 1> [ 1> _InIt=int 1> ] 1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(375): error C2868: “std::iterator_traits<_InIt>::pointer”: 非法的 using 聲明語法;應輸入限定名 1> with 1> [ 1> _InIt=int 1> ] 1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(376): error C2825: '_Iter': 當后面跟“::”時必須為類或命名空間 1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(376): error C2039: “reference”: 不是“`global namespace'”的成員 1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(376): error C2146: 語法錯誤: 缺少“;”(在標識符“reference”的前面) 1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(376): error C2602: “std::iterator_traits<_InIt>::reference”不是“std::iterator_traits<_InIt>”基類的成員 1> with 1> [ 1> _InIt=int 1> ] 1> e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(376) : 參見“std::iterator_traits<_InIt>::reference”的聲明 1> with 1> [ 1> _InIt=int 1> ] 1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(376): error C2868: “std::iterator_traits<_InIt>::reference”: 非法的 using 聲明語法;應輸入限定名 1> with 1> [ 1> _InIt=int 1> ] 1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(584): error C2665: “std::_Debug_range2”: 2 個重載中沒有一個可以轉換所有參數類型 1> e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(567): 可能是“void std::_Debug_range2<_InIt>(_RanIt,_RanIt,std::_Dbfile_t,std::_Dbline_t,std::random_access_iterator_tag)” 1> with 1> [ 1> _InIt=int 1> , _RanIt=int 1> ] 1> e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(559): 或 “void std::_Debug_range2<_InIt>(_InIt,_InIt,std::_Dbfile_t,std::_Dbline_t,std::input_iterator_tag)” 1> with 1> [ 1> _InIt=int 1> ] 1> 嘗試匹配參數列表“(int, int, std::_Dbfile_t, std::_Dbline_t, int)”時
首先看到這么多的錯誤信息就頭大,看都不想看,所以我沒仔細看這些錯誤信息,就直接把錯誤信息的第一行復制到瀏覽器中去找解決辦法,找了挺久時間,確實看到了類似的錯誤信息,但是跟我也不完全一樣,最后看到網上說出現這種情況的原因可能是參數錯誤或者自定義函數名和庫函數名沖突,函數名沖突這個可以排除,因為我確保函數名沒有沖突,所以就定位在了參數錯誤,最后發現 sort 函數的前兩個參數必須是迭代器或指針,但是我寫了兩個整型,所以報錯。
出錯的位置
1 // 排序 2 // sort(cakes, cakes + N, cmp); // 正確寫法 3 // sort(0, N, cmp); // 錯誤寫法
查到的sort函數聲明
template <class RandomAccessIterator, class Compare> void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
總結:回過頭來仔細看看錯誤信息,發現確實有一點可以看懂的提示,就是我標紅的那段,所有提示中出現的函數名中只有這個sort函數名是我見過的,說明其他的都是庫函數,說明錯誤一定是這個sort函數的調用錯誤,而且貌似標紅的錯誤信息中還提示了參數不匹配的信息,但是由於對冗長錯誤信息的恐懼感,促使我一開始選擇跳過這些錯誤提示,如果早一點看到這個信息,可以省很多時間,所以告訴自己以后如果再碰到這種又臭又長又看不懂的錯誤信息時,第一時間不要跳過這些提示,應該從中找到自己認識的部分,很可能錯誤就出在那里。