2009-09-17 14 views
5

コピーできない要素を持つSTLコンテナを使用する方法はありますか?このようなコピー不可能な要素のコンテナを作成する方法

何か:

class noncopyable 
{ 
    noncopyable(noncopyable&); 
    const noncopyable& operator=(noncopyable&); 
public: 
    noncopyable(){}; 
}; 

int main() 
{ 
    list<noncopyable> MyList; //error C2248: 'noncopyable::noncopyable' : cannot access private member declared in class 'noncopyable' 
} 

答えて

15

コピーできない要素は、C++コンテナクラスには存在できません。

標準によると、23.1パラグラフ3「これらのコンポーネントに格納されるオブジェクトのタイプは、CopyConstructibleタイプ(20.1.3)の要件を満たさなければならず、Assignableタイプの追加要件」を満たす必要があります。

+0

良い点!彼が新しいC++ STLでかなり新しいコンパイラを使用すれば、std :: unique_ptrがオプションになる可能性があります。 – jdehaan

+0

私はオブジェクトの複雑な深いコピーの必要性を取り除くことによって私の問題を解決しなければなりませんでした。私はこの質問に直接答えるので、この回答を選択しました。しかし、もう一つは良いです! – Vargas

+1

これらが要件である場合、unique_ptrをベクトルまたはリストに格納することはなぜ可能ですか? unique_ptrはコピーコンストラクタブルではありません。 –

15

1つのオプションは、要素(できれのshared_ptr)へのポインタのリストを作成することです。これはまさにあなたが望むものではありませんが、それは仕事を完了させるでしょう。

+2

IIRCの 'std :: list'は、要素をコピーコンストラクタブルにする必要があるため、+ 1つ以上の唯一のオプションです。 –

+0

それはまさに私が避けようとしていることですが、私はMyList.clear()を呼び出すことがあります。コピーできないようにするためのデストラクタを呼び出す必要があります。 – Vargas

+0

Yup - 標準では、「これらのコンポーネントに格納されるオブジェクトのタイプは、CopyConstructible タイプ(20.1.3)の要件と、割り当て可能タイプの追加要件を満たしている必要があります。 –

2

もう1つの方法は、Boost Pointer Container libraryを使用することです。これは、std :: auto_ptrsの標準コンテナのように機能します。そのようなことは可能です:要素の排他的所有権を保持し、コピーすることはできません。 shared_ptrsの標準コンテナよりもオーバーヘッドが少なくなります。

関連する問題