2010-06-19 57 views
3

我有一個無法移動或複製的類型(通過使必要的構造函數和運算符變爲私有)。但是,當我試圖編譯它們的std :: list時,操作失敗,出現了一個非常奇怪的錯誤(爲簡潔起見,縮減了類名稱)。std :: list的類型要求

1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xmemory(202) 
: error C2248: 'T::T' : cannot access private member declared in class 'T' 

當然,鏈接列表中的類型並非是可移動或可複製的。

當這些成員被公開時,代碼會很好地編譯 - 即使std :: list試圖訪問它們,它也是一個無法解析的外部函數,因爲它們只是被聲明爲private。是沒有意義的:(

+3

「當然,它不是一個鏈接列表中的類型是任意可移動或可複製的。」那麼它應該如何從列表外部獲得值到內部該列表?:) – GManNickG 2010-06-19 20:53:29

+0

通過使用調整大小和默認構建它們。爲什麼沒有明確的功能來添加默認構建的函數,我不知道。 – Puppy 2010-06-19 20:54:58

+2

因爲,由於容器需求明確指出對象必須是可複製構建的,所以沒有太多理由去打擾它。 – 2010-06-19 22:12:46

回答

9

作爲C++ 03,元件必須拷貝構造和拷貝分配§23.1/ 3:

的類型存儲在這些部件的對象必須滿足複製構造的要求類型(20.1.3),以及可分配類型的附加要求。

在C++ 0x中,要求換上了每個操作,但總的來說它可以安全地說元素必須被移動constructible和可移動(儘管有些操作需要複製可構建性和賦值能力等)

你的問題的典型解決方案是通過shared_ptr或其他一些智能指針存儲指向對象的指針。

+0

但是,如果代碼公開,代碼不會生成錯誤。如果它們必須是可複製的,它們應該如此,因爲它們只被聲明。 – Puppy 2010-06-19 20:46:13

+5

@DeadMG,這是因爲編譯器正在刪除副本,因此不需要定義函數。它仍然必須可以訪問。 – avakar 2010-06-19 20:49:32

+0

解釋它。可惜我不能將評論標記爲答案。 – Puppy 2010-06-19 22:56:14

0

標準集裝箱需要他們的元素的類型爲可複製,如果你有不可複製的類型,使用(智能)指針作爲元素類型,而不是(如:std::list<boost::shared_ptr<YourType> >,除非你使用它們

模板類/功能往往產生錯誤明確地說,所以它可能是你沒有得到一個錯誤