gcc compiler warning: “will be initialized after/when initialized here”
From: http://blog.csdn.net/qtyl1988/article/details/6818325
先看看我為二叉樹寫的結點類:
template <class ElemType> class TreeNode { private:TreeNode* lchild;TreeNode* rchild; public:ElemType data;TreeNode(const ElemType& item,TreeNode* lptr=NULL,TreeNode* rptr=NULL):data(item),lchild(lptr),rchild(rptr){ }~TreeNode(){ }TreeNode*& LeftChild(){return lchild;}TreeNode*& RightChild(){return rchild;} };好了,現在單看其中的構造函數:
TreeNode(const ElemType& item,TreeNode* lptr=NULL,TreeNode* rptr=NULL):??data(item),lchild(lptr),rchild(rptr){ }
?有問題嗎?有!編譯一下,立馬出現warning,全文記不清了,但是肯定有這么兩個短語:"will be initialized after/when initialized here"。啥意思?其實我也沒理解。然后上網搜,答案出來了,你需要把這個構造函數的初始化列表改一改:
TreeNode(const ElemType& item,TreeNode* lptr=NULL,TreeNode* rptr=NULL):??lchild(lptr),rchild(rptr),data(item){ }
其實gcc給的這個warning就是為了提醒你,初始化列表中數據成員的初始化順序應該和你在類的聲明中給出數據成員的順序一致!用英語說,就是“Make sure the members appear in the initializer list in the same order as they appear in the class!”(這句話來自我找到答案的那個網站。)
當然,你還可以不使用初始化列表,而把初始化數據成員的工作放在構造函數體內。不過或許你需要為此重載賦值操作符“=”。
話又說回來,為什么初始化列表的順序還有講究?為什么會這樣?
總結
以上是生活随笔為你收集整理的gcc compiler warning: “will be initialized after/when initialized here”的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【基础篇】Navicat让MySQL数据
- 下一篇: C++实现静态顺序表的增删查改以及初始化