2016-09-07 11 views
4

アロケータがどのように動作するかを理解しようとしています。しかし、私は、アロケータを受け入れる簡単なコンテナを実装しようとすると問題に遭遇します。今私はこれで終わった場合:それは私にそのエラーを修正する方法エラーmember function 'allocate' not viable: 'this' argument has type 'const allocator_type' (aka 'const std::__1::allocator<int>'), but function is not marked const簡単なアロケータ対応コンテナ?

を与える

template<class T, class Allocator =std::allocator<T>> class Container { 
public: 
    using allocator_type = Allocator; 
    using value_type  = T; 
    using pointer   = typename std::allocator_traits<allocator_type>::pointer; 
    using reference   = value_type&; 
    using size_type   = std::size_t; 

    Container(size_type n =0 , const allocator_type& allocator =allocator_type()){ 
     std::cout << "ctor" << std::endl; 
     allocator.allocate(n); 
    }; 
}; 

int main(int argc, const char* argv[]){ 
    Container<int> c {5}; 
    return 0; 
} 

、してください?何か不足していますか? 私は後で形質を使うつもりですが、古いものを最初に使って機能させたいと思います。 const方法として定義されていないallocatorallocateメソッドを呼び出す

+0

それは、関数ではありませんが、 'const'とマークされた' allocator'です。 libC++のやり方を見てみると、libstdC++はこれを 'std :: vector'のように実装しています。 – NathanOliver

+0

標準コンテナは、通常、このconst参照を使用して、独自のメンバ(または基本クラス)を初期化し、このメンバに対してallocateを呼び出すことができます。 – SergeyA

答えて

1

あなた線

allocator.allocate(n); 

試みます。あなたが見ても、allocatorのタイプはconst allocator_type&です。すなわち、allocator_typeのconst参照です。

どうすれば使用できますか?あなたが通常constオブジェクト(またはそのオブジェクトへの参照)を使ってできることの1つは、そこから別の非constオブジェクトを構築することです。これは、例えば、構築します。

allocator_type(allocator).allocate(n); 

をSergeyAが正しくコメントで指摘するとおり、それは一時的なアドホックallocator_typeを構築するのではなく、このようなメンバーをしないように、かなり一般的である:

allocator_type m_alloc; // Should probably be private 

    Container(size_type n =0 , const allocator_type& allocator =allocator_type()) : 
      m_alloc{allocator}{ 
     std::cout << "ctor" << std::endl; 
     m_alloc.allocate(n); 
    }; 
+0

それをconstキャストするのは悪い習慣でしょうか?それをメンバーにすることはかなり自然でエレガントなようです。 –

+0

@JiříLechner 'const_cast'は、通常、問題の明確な兆候です。ここでもまた、注意するように、それをバイパスする非常に自然な方法があります。なぜそうではありませんか? –

+0

もう1つ質問があります。私はunique_ptrを使いたいと思います。 unique_ptrを返すアロケータの特殊化を行うことをお勧めしますか、アロケータの仕事の範囲外ですか? –

関連する問題