前言
最近講STL算法篇的時候出了一個比較有意思的錯誤,在講STL中的捆綁函數的時候出現了個莫名錯誤,使用庫中的仿函數沒有任何問題,使用自己寫的仿函數進行捆綁調用的時候竟然出現莫名問題。今天在這裡分享給大家,希望對大家有幫助哦。首先了解下以下前置知識:
- 仿函數
- 捆綁函數
仿函數
C++STL中很多算法都是結合仿函數使用的,仿函數主要擔當的是排序準則和批量處理數據的功能。
仿函數:讓類模仿的函數調用的方式去使用,我們以sort排序算法為例。有如下代碼:
庫中排序準則就是所謂的仿函數,仿函數的其實只需要重載()運算符即可,less
捆綁函數
- bind1st 綁定左操作數
- bind2nd 綁定右操作數
假設存在函數int sum(int i,int j) ,在使用捆綁函數的時候我們可以限定,i和j的值 ,通過捆綁函數實現
bind1st 限定的是i參數 bind2nd限定的是j參數,具體案例參照案例:
count_if :條件統計,greater中本來是a>b的的重載操作,bind2nd讓b固定為4 故篩選為4的元素個數
錯誤展示
產生如下錯誤:(部分錯誤數據顯示,完整有很多問題)
<code>error C2039: “first_argument_type”: 不是“compareLess”的成員 /<code>
參見對正在編譯的類 模板 實例化“std::binder2nd<compareless>>”的引用
語法錯誤: 缺少“,”(在標識符“first_argument_type”的前面)
“first_argument_type”: 未聲明的標識符
“result_type”: 不是“compareLess”的成員 /<compareless>
語法錯誤: 缺少“,”(在標識符“result_type”的前面)
“result_type”: 未聲明的標識符
“std::unary_function”: 模板 參數太多
參見“std::unary_function”的聲明
error C2955: “std::unary_function”: 使用 類 模板 需要 模板 參數列表
參見“std::unary_function”的聲明
error C2146: 語法錯誤: 缺少“,”(在標識符“first_argument_type”的前面)
1>d:\\software\\vc\\include\\\\xfunctional(490): error C2065: “first_argument_type”: 未聲明的標識符
1>d:\\software\\vc\\include\\\\xfunctional(491): error C2039: “result_type”: 不是“compareLess”的成員
1>d:\\software\\vc\\include\\\\xfunctional(491): error C2146: 語法錯誤: 缺少“,”(在標識符“result_type”的前面)
1>d:\\software\\vc\\include\\\\xfunctional(491): error C2065: “result_type”: 未聲明的標識符
1>d:\\software\\vc\\include\\\\xfunctional(491): error C2977: “std::unary_function”: 模板 參數太多
1> d:\\software\\vc\\include\\\\xstddef(126) : 參見“std::unary_function”的聲明
1>d:\\software\\vc\\include\\\\xfunctional(492): error C2955: “std::unary_function”: 使用 類 模板 需要 模板 參數列表
1> d:\\software\\vc\\include\\\\xstddef(126) : 參見“std::unary_function”的聲明
1>d:\\software\\vc\\include\\\\xfunctional(493): error C2955: “std::unary_function”: 使用 類 模板 需要 模板 參數列表
1> d:\\software\\vc\\include\\\\xstddef(126) : 參見“std::unary_function”的聲明
1>d:\\software\\vc\\include\\\\xfunctional(495): error C2039: “second_argument_type”: 不是“compareLess”的成員
1>d:\\software\\vc\\include\\\\xfunctional(495): error C4430: 缺少類型說明符 - 假定為 int。注意: C++ 不支持默認 int
1>d:\\software\\vc\\include\\\\xfunctional(495): error C2143: 語法錯誤 : 缺少“,”(在“&”的前面)
1>d:\\software\\vc\\include\\\\xfunctional(513): error C2039: “second_argument_type”: 不是“compareLess”的成員
1>d:\\software\\vc\\include\\\\xfunctional(513): error C2146: 語法錯誤: 缺少“;”(在標識符“value”的前面)
1>d:\\software\\vc\\include\\\\xfunctional(513): error C4430: 缺少類型說明符 - 假定為 int。注意: C++ 不支持默認 int
然後用類去繼承,依然會出現問題如下問題:
報錯如下:
<code>error C3848: 具有類型“const compareLess”的表達式 /<code>
會丟失一些 const-volatile 限定符以調用“bool compareLess::operator ()(T,T)”
這個問題搞了10來分鐘沒搞定,最終的問題其實很出乎意料,通過觀察 std::unary_function類發現問題只是因為缺少一個const修飾成員函數而出錯。
尾言
文章都是手打原創,每天最淺顯的介紹C語言、C++,windows知識,喜歡我的文章就關注一波吧,可以看到最新更新和之前的文章哦。
如果足下基礎比較差,不妨關注下人人都可以學習的視頻教程,通俗易懂,深入淺出,一個視頻只講一個知識點。視頻不深奧,不需要鑽研,在公交、在地鐵、在廁所都可以觀看,隨時隨地漲姿勢
最後大家在學習C++泛型編程的時候有哪些有趣的錯誤呢?都可以在評論區留下足跡哦!
閱讀更多 C語言基礎 的文章