為何C++泛型編程錯誤頻出?莫名問題解析,錯誤竟然只是小小const

前言

為何C++泛型編程錯誤頻出?莫名問題解析,錯誤竟然只是小小const

最近講STL算法篇的時候出了一個比較有意思的錯誤,在講STL中的捆綁函數的時候出現了個莫名錯誤,使用庫中的仿函數沒有任何問題,使用自己寫的仿函數進行捆綁調用的時候竟然出現莫名問題。今天在這裡分享給大家,希望對大家有幫助哦。首先了解下以下前置知識:

  1. 仿函數
  2. 捆綁函數

仿函數

C++STL中很多算法都是結合仿函數使用的,仿函數主要擔當的是排序準則和批量處理數據的功能。

仿函數:讓類模仿的函數調用的方式去使用,我們以sort排序算法為例。有如下代碼:

為何C++泛型編程錯誤頻出?莫名問題解析,錯誤竟然只是小小const

庫中排序準則就是所謂的仿函數,仿函數的其實只需要重載()運算符即可,less 是小於 做從小到大排序,greater 是大於做從大到小排序的,其實我們自己也可以實現這樣的一個模板類,以及仿函數。如用自己寫的仿函數替換庫中的仿函數:

為何C++泛型編程錯誤頻出?莫名問題解析,錯誤竟然只是小小const

捆綁函數

  1. bind1st 綁定左操作數
  2. bind2nd 綁定右操作數

假設存在函數int sum(int i,int j) ,在使用捆綁函數的時候我們可以限定,i和j的值 ,通過捆綁函數實現

bind1st 限定的是i參數 bind2nd限定的是j參數,具體案例參照案例:

為何C++泛型編程錯誤頻出?莫名問題解析,錯誤竟然只是小小const

count_if :條件統計,greater中本來是a>b的的重載操作,bind2nd讓b固定為4 故篩選為4的元素個數

錯誤展示

為何C++泛型編程錯誤頻出?莫名問題解析,錯誤竟然只是小小const

產生如下錯誤:(部分錯誤數據顯示,完整有很多問題)

<code>error C2039: “first_argument_type”: 不是“compareLess”的成員
參見對正在編譯的類 模板 實例化“std::binder2nd<compareless>>”的引用
語法錯誤: 缺少“,”(在標識符“first_argument_type”的前面)
“first_argument_type”: 未聲明的標識符
“result_type”: 不是“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
/<compareless>
/<code>

然後用類去繼承,依然會出現問題如下問題:

為何C++泛型編程錯誤頻出?莫名問題解析,錯誤竟然只是小小const

報錯如下:

<code>error C3848: 具有類型“const compareLess”的表達式
會丟失一些 const-volatile 限定符以調用“bool compareLess
::operator ()(T,T)”
/<code>

這個問題搞了10來分鐘沒搞定,最終的問題其實很出乎意料,通過觀察 std::unary_function類發現問題只是因為缺少一個const修飾成員函數而出錯。

為何C++泛型編程錯誤頻出?莫名問題解析,錯誤竟然只是小小const

尾言

文章都是手打原創,每天最淺顯的介紹C語言、C++,windows知識,喜歡我的文章就關注一波吧,可以看到最新更新和之前的文章哦。

如果足下基礎比較差,不妨關注下人人都可以學習的視頻教程,通俗易懂,深入淺出,一個視頻只講一個知識點。視頻不深奧,不需要鑽研,在公交、在地鐵、在廁所都可以觀看,隨時隨地漲姿勢

最後大家在學習C++泛型編程的時候有哪些有趣的錯誤呢?都可以在評論區留下足跡哦!


分享到:


相關文章: