看板 EE_DSnP 關於我們 聯絡資訊
嗚......原本打算無聲無息的自己寫完bst的 結果到頭來還是要來麻煩大家orz 事情是這樣的... 今天我好不容易寫完bst...怎知compile怎麼樣都不給過囧 簡單介紹一下(有雷!, 雖然我論會進來看的都應該是已經寫完或不用寫的強者XD) 我的iterator裡面採用了_root,_node,_trace三個data member 來儲存關於一個BSTreeNode的資訊 _root就紀錄了到底這個_node是從哪棵樹的根開始長的 _trace應該大家都知道了...吧XD? 這三個data member我都放在private裡面,都非const且非static 然後我的constructor有兩種 一種就是用iterator作initialize 另一種用兩個BSTreeNode<T>*,也就是_root和_node作initialize 寫法是: iterator(傳參數):初始化_root和_node{updateTrace();} updateTrace()是一個函數可以讓我把_trace走到_node目前在的地方 其實可以傳參數BSTreeNode<T>* 不傳的話就是從_root作出發點 可是呢....我拿去compile的時候,正義的compiler就說: 174: error: invalid use of non-static data member 'BSTree::iterator::_itrRoot' 175: error: invalid use of non-static data member 'BSTree::iterator::_trace' 174、175就是我宣告這兩個變數的地方 可是在他們上面作鄰居的_node就完全沒有事情 所以私心懷疑是updateTrace();這個函數的問題?? 可是我另外寫了一個小程式 也是在initialize的時候會跑去叫一個會存取到data member的函數 他就沒有出事 所以不太懂到底為甚麼會被指正說_itrRoot和_trace一定要是static...orz 外面也沒有任何會有需要直接在沒有物件生成的時候就去找_itrRoot 還有_trace的情況...... 另外我前後檢查了好幾次...大概沒有漏掉{}或是;的樣子囧 煩請各位高手指點迷津了XD -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.37.102.31
a3785lexx:啊...我知道了orz...剛剛又多作了一點點實驗 12/04 18:42
a3785lexx:發現是不能把這兩個變數拿去當作參數default用... 12/04 18:42
a3785lexx:就算是member function的parameter default也不行 12/04 18:43
a3785lexx:但是如果可以的話,會有什麼問題嗎?? 12/04 18:43
a3785lexx:也就是說為甚麼當初會禁止這樣使用呢?? 12/04 18:43
ric2k1:因為在 constructor 的 initializer list 時 data member 12/04 22:00
ric2k1:還沒有被建立起來, 所以當然不能拿來用. 要到 { 才算是建好 12/04 22:01
a3785lexx:我當時會那樣寫覺得應該不會出事的想法是... 12/05 04:34
a3785lexx:跑到constructor的initializer list之後data member就 12/05 04:34
a3785lexx:建好了,所以進到{}裡面去call updateTrace() 12/05 04:35
a3785lexx:應該不會出包才對... 12/05 04:35
a3785lexx:不過看來好像事實是nonstatic data member 12/05 04:36
a3785lexx:就不能拿去給member function的parameter當default值用 12/05 04:37
a3785lexx:XD? 12/05 04:37