最近在協助同事定位問題的時候,發現乙個有趣的問題。使用std::map的insert函式插入的時候,總是報了乙個莫名的錯誤。std::mapmap_data;而 t的型別,則是乙個第三方的類型別。而看到的報錯,則是完全沒有頭緒。
說實話,如果再來一次,這種問題我來看錯誤,我是肯定想不到是這種原因導致的,因為錯誤資訊中完全找不到跟問題相關的提示,這也是c++編繹器一直被詬病的乙個原因。
這裡把報錯的資訊貼出來,方便遇到類似問題的同學找到這個問題。
g++ -c test.cpp這裡直接把原因給出來:因為使用類的拷貝建構函式被定義成私有了,不允許類被拷貝,而insert函式需要拷貝類的物件,需要呼叫類的拷貝建構函式。test.cpp: in function 『int main(int, char**)』:
test.cpp:37:46: error: no matching function for call to 『std::map::insert(std::pair)』
map_test.insert(std::make_pair(str, cond));
^in file included from /usr/local/gcc-7.1/include/c++/7.1.0/map:61:0,
from test.cpp:2:
/usr/local/gcc-7.1/include/c++/7.1.0/bits/stl_map.h:795:7: note: candidate: std::pair, std::_select1st>, _compare, typename __gnu_cxx::__alloc_traits<_alloc>::rebind>::other>::iterator, bool> std::map<_key, _tp, _compare, _alloc>::insert(const value_type&) [with _key = std::__cxx11::basic_string; _tp = cond; _compare = std::less; _alloc = std::allocator>; typename std::_rb_tree<_key, std::pair, std::_select1st>, _compare, typename __gnu_cxx::__alloc_traits<_alloc>::rebind>::other>::iterator = std::_rb_tree_iterator>; std::map<_key, _tp, _compare, _alloc>::value_type = std::pair]
insert(const value_type& __x)
^~~~~~
/usr/local/gcc-7.1/include/c++/7.1.0/bits/stl_map.h:795:7: note: no known conversion for argument 1 from 『std::pair』 to 『const value_type& 』
/usr/local/gcc-7.1/include/c++/7.1.0/bits/stl_map.h:803:2: note: candidate: templatestd::pair, std::_select1st>, _compare, typename __gnu_cxx::__alloc_traits<_alloc>::rebind>::other>::iterator, bool> std::map<_key, _tp, _compare, _alloc>::insert(_pair&&) [with _pair = _pair; = ; _key = std::__cxx11::basic_string; _tp = cond; _compare = std::less; _alloc = std::allocator>]
insert(_pair&& __x)
#include
#include
#include
#include
//#include "test.h"
using
namespace std;
template
<
class
t>
class
st
t a;};
typedef st<
int> st_int;
class
cond
;int
main
(int argc,
char
** ar**)
解決方案:這種類型別,無法使用類物件進行拷貝,可以考慮採用儲存指標等其他間接方式。
以後遇到stl的操作時,如果遇到類似的問題,可以先往這個方向去猜想。作為經驗記下來。
乙個常見的錯誤
d software codeblocks test1 main.c 28 warning suggest parentheses around assignment used as truth value wparentheses warning的有道翻譯 警告 建議括號周圍的賦值作為真值 如下 ...
Makefile 的乙個常見錯誤
因為工作需要,經常要寫window 和 unix 系統相容的程式。可是,我在visual studio 2005 上寫好makefile 以後,放到freebsd 上,就是編譯不了,報下面的錯誤 make fatal errors encountered cannot continue 我寫了乙個很...
TableView 使用時的乙個異常
node是乙個結構體,anode作為node型別的指標,datalist是table的資料來源,資料新增方法如下 datalist addobject nsvalue value anode withobjctype encode struct node 下面是tableview部分 static ...