2012-07-06 165 views
2

我正在構建STL列表。我做了一個裝飾類(MyList),它是一個特殊類的列表(ProtectMe)。我希望列表中的所有項目都是const。因此,這裏是我做了什麼:將const引用強制轉換爲const指針的常量指針

#include <list> 

using namespace std; 

class ProtectMe{ 
private: 
    int data_; 
public: 
    ProtectMe(int data):data_(data){ 
    } 

    int data() const{return data_;} 
}; 

class MyList{ 
private: 
    //A list of constant pointers to constant ProtectMes. 
    list<const ProtectMe* const> guts_; 
public: 
    void add(const ProtectMe& data){ 
     guts_.push_front(&data); 
    } 
}; 

我得到以下編譯錯誤:

 
error: ‘const _Tp* __gnu_cxx::new_allocator::address(const _Tp&) const [with _Tp = const ProtectMe* const]’ cannot be overloaded 

我還在抓我的頭試圖解碼哪裏出了問題。爲什麼不編譯這個代碼?我應該改變什麼?

+2

'guts_.push_front(const &data);'爲什麼關鍵字常量在括號中?爲什麼你希望列表元素是指針類型? – Mahesh 2012-07-06 20:04:50

+0

@Mahesh:沒有什麼好的理由,只是想讓它編譯,顯然沒有幫助。我會刪除它... – User1 2012-07-06 20:06:17

+0

爲什麼不只是列表你是否從其他地方派生ProtectMe? – mathematician1975 2012-07-06 20:12:23

回答

2

標準容器的value_type必須是CopyInsertable(或MoveInsertable)才能使push_front正常工作。 list<const ProtectMe* const>的值類型不變,因此它不是CopyInsertable

CopyInsertable意味着

allocator_traits<A>::construct(m, p, v); 

被很好地定義,其中p是指向value_type,默認情況下的呼叫放置在頁碼新的,因此需要它是一個非const指針。

+0

有趣的。所以,我將如何有一個const對象的列表?顧名思義,我想要ProtectMe假設在ProtectMe中有一個非const方法... – User1 2012-07-06 20:18:34

+0

@ User1:'list '就足夠了,您將無法修改指向的ProtectMe。 – ybungalobill 2012-07-06 20:23:53

+0

Ahh好點。謝謝你的幫助! – User1 2012-07-06 20:26:12

相關問題